【问题标题】:Oracle SQL: Filtering rows with non-numeric charactersOracle SQL:过滤非数字字符的行
【发布时间】:2016-10-19 11:08:52
【问题描述】:

我的问题与one 非常相似:从具有 A 列和 B 列的表中删除所有行,其中一些记录包含非数字字符(看起来像“1234#5”或“1bbbb”)。但是,我阅读的解决方案似乎对我不起作用。例如,

SELECT count(*) FROM tbl  
--962060;


SELECT count(*)
FROM tbl
WHERE (REGEXP_like(A,'[^0-9]') OR REGEXP_like(B,'[^0-9]') ) ;
--17


SELECT count(*)
FROM tbl
WHERE (REGEXP_like(A,'[0-9]') and REGEXP_like(B,'[0-9]') )
;
--962060

从第三个查询中,我希望看到 (962060-17)=962043。为什么还是962060?像这样的alternative 查询也给出了相同的答案:

SELECT count(*)
FROM tbl
WHERE (REGEXP_like(A,'[[:digit:]]')and REGEXP_like(B,'[[:digit:]]') )
;
--962060

当然,我可以通过 query1 减去 query2 来绕过这个问题,但是我想学习如何使用正则表达式来做到这一点。

【问题讨论】:

  • 'AB0' 这样的字符串会同时满足这两个条件。

标签: sql regex oracle numeric


【解决方案1】:

如果你使用正则表达式,你应该考虑到字符串的任何部分都可能被匹配为正则表达式。根据您的示例,您应该指定整个字符串应仅包含数字 ^ - 是字符串 $ 的开头 - 是结尾。你可以使用\d- 是数字

 SELECT count(*)
 FROM tbl
  WHERE (REGEXP_like(A,'^[0-9]+$') and REGEXP_like(B,'^[0-9]+$') )

 SELECT count(*)
 FROM tbl
  WHERE (REGEXP_like(A,'^\d+$') and REGEXP_like(B,'^\d+$') )

【讨论】:

  • 太棒了。谢谢迈克尔的解释!
  • 我刚刚发现的另一个(不太深入的)解决方案只是使用 NOT:SELECT count(*) FROM tbl WHERE NOT (REGEXP_like(A,'[^0-9]') OR REGEXP_like(B ,'[^0-9]') ) ;
【解决方案2】:

我知道您特别要求提供正则表达式解决方案,但 translate 也可以解决这类问题(而且通常更快,因为正则表达式使用更多的处理能力):

select count(1)
from tbl
where translate(a, 'x0123456789', 'x') is null
and translate(b, 'x0123456789', 'x') is null;

这是做什么的:将字符 0123456789 转换为 null,如果结果是 null,那么输入必须是所有数字。 'x' 就在那里,因为 translate 的第三个参数不能是 null

我想我应该在这里添加这个,可能对其他读者有帮助。

【讨论】:

  • 绝对更快!感谢您添加此内容。
  • 但是,从 TRANSLATE 的 definition 来看,我无法理解为什么 select TRANSLATE('5468127', 'x0123456789', 'x') from dual ; 应该为 NULL 而不是“xxxxxxx”。也因为select TRANSLATE('x', 'x', 'x') from dual ; 是“x”而不是 NULL。你能解释一下吗?
  • @Nonancourt 我扩大了我的答案。
  • 哦,我明白了!换句话说,translate 的第三个参数中缺少的字符将数字发送到null...谢谢!
  • 是的。你会认为translate('123', '0123456789', null) 可以,但由于第三个参数不能为空,因此诀窍是添加一个被翻译为“x”的“x”(即实际上没有翻译)。
猜你喜欢
  • 2011-07-13
  • 2014-07-22
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
  • 2023-02-07
  • 2020-01-29
  • 2015-05-30
  • 1970-01-01
相关资源
最近更新 更多