下面是一个正则表达式:(在Oracle的regexp_like()
上运行,尽管该问题并非特定于Oracle)
abc|bcd|def|xyz
这基本上匹配数据库上的tags
字段,以查看当用户输入搜索查询“abc bcd def xyz
“时,tags
字段是否包含abc
ORbcd
ORdef
ORxyz
。数据库上的tags
字段保存由空格分隔的关键字,例如“cdefg abcd xyz”
在Oracle上,这类似于:
select ... from ... where
regexp_like(tags, 'abc|bcd|def|xyz');
它现在运行得很好,但是我想为用户添加一个额外的选项来搜索与所有关键字匹配的结果。我应该如何更改正则表达式,使其与abc
ANDbcd
ANDdef
ANDxyz
匹配?
注意:因为我不知道用户将输入哪些确切的关键字,所以我无法在PL/SQL中预先构建查询,如下所示:
select ... from ... where
tags like '%abc%' AND
tags like '%bcd%' AND
tags like '%def%' AND
tags like '%xyz%';
3条答案
按热度按时间wfsdck301#
您可以拆分输入模式并检查模式的所有部分是否匹配:
或者,如果在数据库中启用了Java,则可以创建一个Java函数来匹配正则表达式:
然后将其 Package 在SQL函数中:
然后在SQL中使用它:
v2g6jxz62#
尝试这样做,其思想是计算匹配的数量==模式的数量:
结果:
jmp7cifd3#
我认为需要dynamic SQL。matchall选项需要单独匹配逻辑以确保找到每个单独的匹配。
一个简单的方法是为每个关键字建立一个联接条件。将联接语句连接成一个字符串。使用动态SQL将该字符串作为查询执行。
下面得示例使用sample schemas provided by Oracle中得customer表.
| 变量|数值|
| - -|- -|
| p匹配字符串|abc bcd定义xyz|
| p匹配类型|以及|
| l_sql_语句|SELECT电子邮件地址FROM客户WHERE 1 = 1 AND电子邮件地址LIKE '%abc%' AND电子邮件地址LIKE '%bcd%' AND电子邮件地址LIKE '%def%' AND电子邮件地址LIKE '%xyz%'|
| 变量|数值|
| - -|- -|
| p匹配字符串|abc bcd定义xyz|
| p匹配类型|或|
| l_sql_语句|SELECT电子邮件地址FROM客户WHERE 1 = 0 OR电子邮件地址LIKE '%abc%' OR电子邮件地址LIKE '%bcd%' OR电子邮件地址LIKE '%def%' OR电子邮件地址LIKE '%xyz%'|