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-z
或A-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 - REGEXP_LIKE 包含字符串“NA”以外的字符
Oracle:Oracle 8i 中 REGEXP_LIKE 函数的替代方案