Oracle SQL:使用LIKE运算符进行模式匹配以发现两个单词模式

时间:2016-02-17 22:35:57

标签: sql regex oracle sql-like

我正在试图弄清楚如何查询列中的“过敏反应”或“过敏反应”这样的双字模式。我尝试了下面的

  • LIKE '% allerg% response %'但这会匹配像“过敏”这样的字符串 2010年1月1日的反应....还没有回应....“

  • 尝试过单词边界LIKE '% \ballerg%\b response %'。这个 表达似乎是错误的。从来没有工作

基本上我希望匹配连续的单词,其中一个单词可以占用很多值。我真的不想在LIKE '..' OR LIKE '..'列出所有可能的值。

有人可以给我一些关于如何解决这个问题的建议吗?

2 个答案:

答案 0 :(得分:1)

您可以使用或运算符|并将括号内的备选项分组

对于您的示例,您需要以下正则表达式:

allerg(ic|y) response

所以你的查询就像:

... WHERE REGEXP_LIKE (col_name, 'allerg(ic|y) response', 'i');

删除区分大小写匹配的'i'参数

作为旁注,oracle好奇地没有单词边界正则表达式操作符!! => source

答案 1 :(得分:0)

您可以使用正则表达式\S*(零或多个非空格字符)或\w*(零个或多个单词字符)来匹配单词的任何结尾:

WITH phrases ( phrase ) AS (
  SELECT 'Allergic Response' FROM DUAL UNION ALL
  SELECT 'Allergy response' FROM DUAL UNION ALL
  SELECT 'Allergy gives a response to ...' FROM DUAL
)
SELECT phrase
FROM   phrases
WHERE  REGEXP_LIKE( phrase, 'Allerg\S* response', 'i' );

<强>输出

PHRASE               
----------------------
Allergic Response      
Allergy response