【问题标题】:Oracle regular expression to pull rows from a tableOracle 正则表达式从表中提取行
【发布时间】:2015-05-13 19:52:37
【问题描述】:

我必须从表中提取行,其中列值包含除字母、数字、连字符、下划线、空格和逗号之外的任何其他内容。如果它只有上述字符,它不应该拉行。感谢您的帮助。

我正在尝试类似 regexp_like 的东西,但没有得到想要的结果。

REGEXP_LIKE(col, '[^[:alnum:]]|(^-)|(^,)|[^[:space:]]|(^_)')

例如:

TD-6 TTY-60X3APTNO DAY  => should not retrieve
TY-2YYTY 20TRH TY L/W   => Should retrieve
TIRREG CL3- HARDWARE &  => Should retrieve

【问题讨论】:

  • 问题是你正在使用正则表达式替换,这是一个逻辑OR ...这是使用NOT (a OR b)(NOT a OR NOT b)之间的区别。请参阅下面的答案。
  • @david-faber 非常感谢您的解释,非常感谢您的及时回复。

标签: sql regex database oracle


【解决方案1】:

您想要字母数字、下划线、逗号或连字符的所有内容?那是对的吗?然后你想要这样的东西:

REGEXP_LIKE(col, '[^A-Za-z0-9_ ,-]')

测试:

WITH d1 AS (
    SELECT 'TD-6 TTY-60X3APTNO DAY' AS col FROM dual
     UNION ALL
    SELECT 'TY-2YYTY 20TRH TY L/W' FROM dual
     UNION ALL
    SELECT 'TIRREG CL3- HARDWARE &' FROM dual
)
SELECT col FROM d1
 WHERE REGEXP_LIKE(col, '[^A-Za-z0-9_ ,-]')

返回:

TY-2YYTY 20TRH TY L/W
TIRREG CL3- HARDWARE &

【讨论】:

  • 太棒了!..非常感谢您的帮助。
【解决方案2】:

使用Oracle's regex conventions

REGEXP_LIKE(col, '[^[:alnum:] _,-]')

Here's a SQLFilddle

括号的工作方式是匹配括号内的任何内容,或者如果您使用插入符号 (^) 引导括号中的项目,则除了括号中的内容之外的任何内容都会匹配。

【讨论】:

  • 非常感谢您的解释。您和以下用户的语法都完美无缺!!。非常感谢您为 SQL fiddle 付出的时间和精力。
  • 请记住,[:space:] 将匹配 所有 空格,包括制表符、换行符和回车符。相当于字符类\s。将连字符 - 放在方括号括起来的正则表达式字符类的中间也不是一个好主意。将它放在末尾或开头是一个好习惯,这样正则表达式引擎就不会认为它是范围的一部分。
  • @DavidFaber 这两个方面都很好,我会更新答案和小提琴。
  • @DavidFaber 酷!很高兴获得更多见解
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
  • 2021-12-05
  • 2017-10-08
相关资源
最近更新 更多