【问题标题】:Possible to create Oracle regular expression that's able to match NULL?可以创建能够匹配 NULL 的 Oracle 正则表达式吗?
【发布时间】:2010-11-13 00:46:02
【问题描述】:

在 Oracle 中,是否可以使用单个正则表达式同时匹配特定字符串格式和空字符串?

类似的东西:

SELECT 1
  FROM DUAL
 WHERE REGEXP_LIKE('12345', '^([1-5]{5})|NULL$');

SELECT 1
  FROM DUAL
 WHERE REGEXP_LIKE('', '^([1-5]{5})|NULL$');

SELECT 1
  FROM DUAL
 WHERE REGEXP_LIKE(NULL, '^([1-5]{5})|NULL$');

其中正则表达式的“NULL”部分被视为字符类而不是字符串文字,并且所有三个查询都返回 1。

我正在编写一些数据验证例程,并且希望只存储/使用一个正则表达式来确定格式以及输入字符串是否可以为空——而不是为每个数据元素单独指定这些验证规则。

谢谢, 杰夫

【问题讨论】:

    标签: regex oracle plsql


    【解决方案1】:

    一个选项:使用

    where regexp_like(expr, '^([1-5]{5})$') or (expr is null) 
    

    【讨论】:

    • +1,这个解决方案不依赖于任何魔法值......一旦语法被纠正...... REGEXP_LIKE(expr, '^([1-5]{5})$ )
    • 讽刺...我的语法更正引入了一个语法错误... :(
    • 嗯,我真的在寻找一个单一的正则表达式,而不是一个额外的谓词。 Codebender 有一个满足该标准的解决方案。
    • 是的,Codebender 的解决方案很好——但它使用了一个额外的函数调用,而不是一个额外的谓词。 (这不是问题,请注意,只是说)
    • "\s" 也可以匹配空字符,仅供参考。其中 regexp_like(nvl(expr,' '), 'abc|\s');
    【解决方案2】:

    这是我的解决方案: REXXP_LIKE(NVL(col, '*'), '&colNameQuery')

    然后用户将使用“*”作为空值和其他所有内容的查询参数。

    【讨论】:

      【解决方案3】:

      我认为您不能直接这样做,但您可以使用nvl 使空值显示为空白字符串或字符串“NULL”。

      SELECT 1
        FROM DUAL
       WHERE REGEXP_LIKE(NVL(value, 'NULL'), '^([1-5]{5})|NULL$');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-17
        • 1970-01-01
        • 1970-01-01
        • 2017-10-04
        • 2013-06-30
        • 2011-02-04
        • 1970-01-01
        相关资源
        最近更新 更多