-2

我正在尝试创建一个查询来检查列是否仅包含单个字符的字符串、破折号、字符串 UNKNOWN、N/A 或 XYZ(不区分大小写)。

我正在尝试使用查询:

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

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

4

1 回答 1

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

于 2013-05-30T09:33:15.407 回答