我试图选择与其“文本”字段匹配的记录,形式如下:
__<sql>__ xyz __</sql>__其中__的意思是任何东西,而xyz代表了我正在寻找的自己的单词。
注意:字段“Text”是一个多行字符串。
以下是查询,但它不返回任何记录:
Select * from reports where regexp_like (text, '(.*)<sql>(.*)(^|\s)xyz(\s|$)(.*)</sql>(.*)', 'i');发布于 2018-03-08 16:00:19
您使用'i'作为REGEXP_LIKE的第三个参数,使搜索不区分大小写。
将其改为'in'。附加的n是REGEXP函数的另一个选项:它告诉正则表达式引擎允许.匹配chr(10) (换行符)。没有此选项的默认行为是. to 而不是匹配换行符。
发布于 2018-03-08 16:14:06
对于这种设置,普通的旧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>%';这里我正在替换新行和选项卡,如果需要的话,可以随意添加其他选项卡,例如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> blahttps://stackoverflow.com/questions/49176646
复制相似问题