【问题标题】:Oracle SQL : Pattern matching using LIKE operator to discover two word patternsOracle SQL:使用 LIKE 运算符进行模式匹配以发现两个单词模式
【发布时间】:2016-02-17 22:35:56
【问题描述】:

我正在尝试弄清楚如何在列中查询“过敏反应”或“过敏反应”等两个单词的模式。我尝试了以下

  • LIKE '% allerg% response %' 但这匹配字符串,例如“Allergic 2010 年 1 月 1 日的反应……还没有反应……”

  • 已尝试字边界LIKE '% \ballerg%\b response %'。这个 表达方式好像不对。没用过

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

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

【问题讨论】:

    标签: sql regex oracle sql-like


    【解决方案1】:

    您可以使用 or 运算符 | 并将括号内的替代项分组

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

    allerg(ic|y) response
    

    所以你的查询变成这样:

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

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

    顺便说一句,奇怪的是,oracle 没有单词边界正则表达式运算符! => source

    【讨论】:

    • 感谢 Enissay!此解决方案适用于我的问题。但我认为MT0下面提到的方法更通用。
    【解决方案2】:

    您可以使用正则表达式\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    
    

    【讨论】:

    • 正是我想要的。感谢 MT0!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    相关资源
    最近更新 更多