Oracle SQL - REGEXP_LIKE 包含字符串“NA”以外的字符

Posted

技术标签:

【中文标题】Oracle SQL - REGEXP_LIKE 包含字符串“NA”以外的字符【英文标题】:Oracle SQL - REGEXP_LIKE contains characters other than string 'NA' 【发布时间】:2019-09-12 13:22:31 【问题描述】:

我想创建一个查询,在其中选择包含a-zA-Z 字符的所有记录,不允许使用字符串'NA'

select *
  from tz_customers c 
 where REGEXP_LIKE(c.customercode,'^NA');

REGEXP_LIKE 允许其他字符串'NA' 以外的所有字符

【问题讨论】:

【参考方案1】:

我可能会使用不等式比较来排除NA

SELECT *
FROM tz_customers
WHERE
    REGEXP_LIKE(customercode, '^[A-Za-z]+$') AND
    customercode <> 'NA';

原则上,我们可以尝试在单个正则表达式模式中使用负前瞻来排除 NA,但我不确定 Oracle 正则表达式是否支持。

【讨论】:

根据 OP 的真正含义,第二个条件可能是 LIKE '%NA%'【参考方案2】:

如果您想要不以NA 开头的字符串,则:

SELECT *
FROM   tz_customers c
WHERE  c.customercode NOT LIKE 'NA%'

如果您想要不包含 NA 的字符串,那么:

SELECT *
FROM   tz_customers c
WHERE  c.customercode NOT LIKE '%NA%'

如果您想要不完全是 NA 的字符串,那么:

SELECT *
FROM   tz_customers c
WHERE  c.customercode <> 'NA'

如果您想要只有字母字符的字符串,那么您可以使用TRANSLATE 去除允许的字符并测试剩余的字符串是否为空(NULL):

SELECT *
FROM   tz_customers c
WHERE  TRANSLATE(
         c.customercode,
         '1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
         '1'
       ) IS NULL

如果你想将两者结合起来:

SELECT *
FROM   tz_customers c
WHERE  TRANSLATE(
         c.customercode,
         '1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
         '1'
       ) IS NULL
AND    c.customercode <> 'NA'

所以对于样本数据:

CREATE TABLE tz_customers ( customercode ) AS
  SELECT 'NA'      FROM DUAL UNION ALL
  SELECT 'BANANA'  FROM DUAL UNION ALL
  SELECT 'BANANA2' FROM DUAL;

这个输出:

|客户代码 | | :----------- | |香蕉 |

db小提琴here

【讨论】:

【参考方案3】:

我认为你不需要 regexp_like:

  select * from tz_customers where customer_code not like '%NA%'

【讨论】:

以上是关于Oracle SQL - REGEXP_LIKE 包含字符串“NA”以外的字符的主要内容,如果未能解决你的问题,请参考以下文章

oracle -sql模式匹配

Oracle SQL - REGEXP_LIKE 包含字符串“NA”以外的字符

Oracle:Oracle 8i 中 REGEXP_LIKE 函数的替代方案

Oracle 正则表达式函数-REGEXP_LIKE 使用例子

Oracle中REGEXP_LIKE与LIKE的区别

oracle 判断字段是否为是数字等 regexp_like用法 正则表达式