【问题标题】:Oracle where condition search in a multiline stringOracle where 在多行字符串中进行条件搜索
【发布时间】:2018-03-08 15:23:46
【问题描述】:

我正在尝试选择“文本”字段与以下表单匹配的记录:

__<sql>__ xyz __</sql>__

其中 __ 表示任何意思,xyz 表示我正在搜索的单词。

注意:“文本”字段是多行字符串。

这是查询,但它不返回任何记录:

Select * from reports where regexp_like (text, '(.*)<sql>(.*)(^|\s)xyz(\s|$)(.*)</sql>(.*)', 'i');

【问题讨论】:

  • 你的问题是什么?
  • @mirzasa 查询,我 postet 不起作用。我已经更新了问题。
  • “不起作用”是什么意思?它是否返回错误(什么是错误消息)?它是否返回太多记录?还是太少了?
  • @mrzasa 它不返回任何行!

标签: regex oracle regexp-like


【解决方案1】:

您使用'i' 作为 REGEXP_LIKE 的第三个参数,以使搜索不区分大小写。

将其更改为 'in'。附加的n 是REGEXP 函数的另一个选项:它告诉正则表达式引擎允许. 匹配chr(10)(换行符)。没有此选项的默认行为是. 匹配换行符。

【讨论】:

    【解决方案2】:

    对于这个设置,普通的旧 LIKE 工作正常。你甚至不需要关心新的行字符。

     where column1 LIKE '%<sql>%xyz%</sql>%'
    

    会做的。

    对于不区分大小写搜索添加LOWER

     where LOWER(column1) LIKE '%<sql>%xyz%</sql>%'
    

    对于 上下文分隔符 搜索,例如全词搜索简单地将所有相关的空白字符替换为空白

     where replace(replace(lower(column1),CHR(10),' '),CHR(9),' ') LIKE '%<sql>% xyz %</sql>%';
    

    这里我替换了 new linetab,请随意添加其他内容,例如如果需要,CHR(13)。

    一般规则是 - 如果您可以使用 LIKE,则更喜欢它而不是 REGEXP,因为 LIKE 的性能要好得多。

    简单演示:

    create   table MYTABLE(column1 varchar2(1000))
    ;
    
    insert into MYTABLE(column1) values('bla bla <sql> bla'||chr(10)||' xyz bla </sql> bla');
    insert into MYTABLE(column1) values('bla bla <sql> bla'||chr(10)||' NO MACTH bla </sql> bla');
    commit;
    
    select * from MYTABLE;
    
    COLUMN1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
    -------------------
    bla bla <sql> bla                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
     xyz bla </sql> bla                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
    
    bla bla <sql> bla                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
     NO MACTH bla </sql> bla
    
     select * from MYTABLE 
     where column1 LIKE '%<sql>%xyz%</sql>%';
    
     COLUMN1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
    -------------------
    bla bla <sql> bla                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
     xyz bla </sql> bla
    

    【讨论】:

    • 在您的解决方案中,您不会考虑区分大小写和整个单词搜索。
    • @AhmadAl-Khazraji : 使用 lower() 会解决这个问题
    • @KaushikNayak lower 并没有解决全词搜索的问题。
    • @KaushikNayak - 它只会处理不区分大小写的搜索。但是,如果您阅读 OP 的代码,您会发现使用正则表达式方法是有充分理由的。 OP没有解释他的查询所做的一切,他只解释了他需要帮助的部分;但是如果你检查正则表达式,你会发现它还有更多。 (在你上面的 OP 评论中的“全词搜索”。)
    • @AhmadAl-Khazraji 我解决了整个单词搜索问题,请参阅更新。
    猜你喜欢
    • 1970-01-01
    • 2018-12-06
    • 2018-07-18
    • 2019-10-24
    • 2012-03-13
    • 1970-01-01
    • 2013-10-10
    • 2016-11-04
    • 1970-01-01
    相关资源
    最近更新 更多