我正在尝试创建一个查询,以检查列是否只包含单个字符,短划线,字符串UNKNOWN,N / A或XYZ(不区分大小写)的字符串。
我正在尝试使用查询:
SELECT *
FROM table_name
WHERE column_1 LIKE '%-%' OR '%#%' OR '%.%' OR '%,%';
但不确定如何在大写字母或一串单个字符后包含'N / A'。此外,当我执行上述查询时,它会抛出错误'Invalid relational operator after '%#%'
答案 0 :(得分:1)
这听起来像是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
包含两次。