我正在尝试选择“文本”字段匹配以下格式的记录:
__<sql>__ xyz __</sql>__
其中__表示任何内容,而xyz表示我正在搜索的单词。
注意:字段'Text'是一个多行字符串。
这是查询,但它不会返回任何记录:
Select * from reports where regexp_like (text, '(.*)<sql>(.*)(^|\s)xyz(\s|$)(.*)</sql>(.*)', 'i');
答案 0 :(得分:3)
您使用'i'
作为REGEXP_LIKE的第三个参数,以使搜索不区分大小写。
将其更改为'in'
。额外的n
是REGEXP函数的另一个选项:它告诉正则表达式引擎允许.
匹配chr(10)
(换行符)。没有此选项的默认行为是.
到不匹配换行符。
答案 1 :(得分: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>%';
我在这里替换新行和标签,随时添加其他内容,例如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