多行字符串中的Oracle where条件搜索
Oracle where condition search in a multiline string
我正在尝试 select 其 'Text' 字段匹配以下形式的记录:
__<sql>__ xyz __</sql>__
其中 __ 表示任何含义,而 xyz 表示我正在搜索的单词。
注意:字段'Text'是一个多行字符串。
这是查询,但 return 没有任何记录:
Select * from reports where regexp_like (text, '(.*)<sql>(.*)(^|\s)xyz(\s|$)(.*)</sql>(.*)', 'i');
您使用 'i'
作为 REGEXP_LIKE 的第三个参数来进行搜索 case-insensitive。
将其更改为 'in'
。额外的 n
是 REGEXP 函数的另一个选项:它告诉正则表达式引擎允许 .
匹配 chr(10)
(换行符)。没有此选项的默认行为是 .
到 不 匹配换行符。
对于此设置,普通的旧 LIKE
工作正常。你甚至不需要关心换行符。
where column1 LIKE '%<sql>%xyz%</sql>%'
会完成任务的。
对于不区分大小写搜索添加LOWER
where LOWER(column1) LIKE '%<sql>%xyz%</sql>%'
对于 上下文定界符 搜索,例如全词搜索简单替换所有相关 white space 字符为空白:
where replace(replace(lower(column1),CHR(10),' '),CHR(9),' ') LIKE '%<sql>% xyz %</sql>%';
这里我替换了new line和tab,欢迎添加其他的,例如如果需要,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
我正在尝试 select 其 'Text' 字段匹配以下形式的记录:
__<sql>__ xyz __</sql>__
其中 __ 表示任何含义,而 xyz 表示我正在搜索的单词。
注意:字段'Text'是一个多行字符串。
这是查询,但 return 没有任何记录:
Select * from reports where regexp_like (text, '(.*)<sql>(.*)(^|\s)xyz(\s|$)(.*)</sql>(.*)', 'i');
您使用 'i'
作为 REGEXP_LIKE 的第三个参数来进行搜索 case-insensitive。
将其更改为 'in'
。额外的 n
是 REGEXP 函数的另一个选项:它告诉正则表达式引擎允许 .
匹配 chr(10)
(换行符)。没有此选项的默认行为是 .
到 不 匹配换行符。
对于此设置,普通的旧 LIKE
工作正常。你甚至不需要关心换行符。
where column1 LIKE '%<sql>%xyz%</sql>%'
会完成任务的。
对于不区分大小写搜索添加LOWER
where LOWER(column1) LIKE '%<sql>%xyz%</sql>%'
对于 上下文定界符 搜索,例如全词搜索简单替换所有相关 white space 字符为空白:
where replace(replace(lower(column1),CHR(10),' '),CHR(9),' ') LIKE '%<sql>% xyz %</sql>%';
这里我替换了new line和tab,欢迎添加其他的,例如如果需要,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