这听起来像是一个完美的用例,REGEXP_LIKE()
而不是拥有大量 OR 运算符。
给定下表:
create table t1 ( str varchar2(100));
insert into t1 values (',');
insert into t1 values ('#');
insert into t1 values ('-');
insert into t1 values ('$');
insert into t1 values ('N/A');
insert into t1 values ('UNKnoWN');
insert into t1 values ('XYZ');
insert into t1 values ('abc');
insert into t1 values ('fdg');
以下查询满足您对特定字符串的要求:
select *
from t1
where regexp_like(str, '([-#,]|xyz|unknown|n/a)','i')
这'i'
意味着它执行不区分大小写的匹配。
稍微复杂一点的是您要求字符串包含所有一个字符。如果我们添加以下行:
insert into t1 values ('rrrr');
insert into t1 values ('ggg');
那么下面的查询也将包括这些,我REGEXP_COUNT()
用来确保字符串中与第一个字符相同的字符数与字符串的长度匹配:
select *
from t1
where regexp_like(str, '([-#,]|xyz|unknown|n/a)','i')
or regexp_count(str, substr(str,1,1)) = length(str)
如果您需要'N/A'
,'XYZ
并且'UNKNOWN'
仅在字符串中没有其他内容时匹配,请使用^
和$
元符号,以确保它仅在字符串的开头和结尾匹配:
insert into t1 values ('g UNKnoWN');
再添加一个测试用例
select *
from t1
where regexp_like(str, '([-#,]|^(xyz|unknown|n/a)$)','i')
or regexp_count(str, substr(str,1,1)) = length(str)
这是一个要演示的SQL Fiddle 。
正则表达式可能非常强大,但它们也有其自身的局限性。我强烈建议阅读链接的文档。
您当前的查询会引发错误,因为它不正确。您需要多次测试该列:
SELECT *
FROM table_name
WHERE column_1 LIKE '%-%'
OR column_1 LIKE '%#%'
请注意,column_1
包含两次。