检查列是否具有已定义的字符集

时间:2013-05-30 07:24:23

标签: sql oracle oracle11g

我正在尝试创建一个查询,以检查列是否只包含单个字符,短划线,字符串UNKNOWN,N / A或XYZ(不区分大小写)的字符串。

我正在尝试使用查询:

SELECT *
  FROM table_name
 WHERE column_1 LIKE '%-%' OR '%#%' OR '%.%' OR '%,%';

但不确定如何在大写字母或一串单个字符后包含'N / A'。此外,当我执行上述查询时,它会抛出错误'Invalid relational operator after '%#%'

1 个答案:

答案 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包含两次。