【问题标题】:ORACLE - regexp_substr to return null valuesORACLE - regexp_substr 返回空值
【发布时间】:2017-08-16 16:25:02
【问题描述】:

我用过regexp_substr(STR,'[^|]+',1,2)这个函数, 它在某些情况下效果很好,但对于 null 场景,它给出了第三个值,

1|CAT|DOG
3|HARRY|GOAT|STACK
6||LION|TIGER  --this row should return null, but the above function gives me LION

预期输出:

CAT
HARRY
(null)

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    @Gary_W has written about 使用该正则表达式模式拆分字符串的问题,正是因为它如何处理空标签。 (还有is on a mission...

    该帖子中的替代方法也适用于此,管道分隔符已转义:

    with t (str) as (
      select '1|CAT|DOG' from dual
      union all select '3|HARRY|GOAT|STACK' from dual
      union all select '6||LION|TIGER' from dual
    )
    select str, regexp_substr(str, '(.*?)(\||$)', 1, 2, null, 1) from t;
    
    STR                REGEXP_SUBSTR(STR,
    ------------------ ------------------
    1|CAT|DOG          CAT               
    3|HARRY|GOAT|STACK HARRY             
    6||LION|TIGER                        
    

    同样适用于第三个元素:

    select str, regexp_substr(str, '(.*?)(\||$)', 1, 3, null, 1) from t;
    
    STR                REGEXP_SUBSTR(STR,
    ------------------ ------------------
    1|CAT|DOG          DOG               
    3|HARRY|GOAT|STACK GOAT              
    6||LION|TIGER      LION              
    

    第四个:

    select str, regexp_substr(str, '(.*?)(\||$)', 1, 4, null, 1) from t;
    
    STR                REGEXP_SUBSTR(STR,
    ------------------ ------------------
    1|CAT|DOG                            
    3|HARRY|GOAT|STACK STACK             
    6||LION|TIGER      TIGER             
    

    【讨论】:

      【解决方案2】:

      您的函数正在返回正确的结果。当你运行你的函数时,

      function regexp_substr(STR,'[^|]+',1,2) 
      

      6||LION|TIGER

      Oracle 未在 || 之间找到任何“NULL”值。如果您在|| 之间添加一个空格,它将返回正确的结果。见下文:

      查询:

      WITH tbl (str)
           AS (SELECT '1|CAT|DOG' FROM DUAL
               UNION ALL
               SELECT '3|HARRY|GOAT|STACK' FROM DUAL
               UNION ALL
               SELECT '6| |LION|TIGER' FROM DUAL) --<-- Space added between | |
      SELECT  REGEXP_SUBSTR (STR,
                            '[^|]+',
                            1,
                            2
                            )        
       FROM tbl
      

      或者,您可以将查询中的所有|| 字符替换为| | 并获得结果。

      WITH tbl (str)
           AS (SELECT '1|CAT|DOG' FROM DUAL
               UNION ALL
               SELECT '3|HARRY|GOAT|STACK' FROM DUAL
               UNION ALL
               SELECT '6||LION|TIGER' FROM DUAL)     
      SELECT REGEXP_SUBSTR ((replace(STR,'||','| |')),
                            '[^|]+',
                            1,
                            2)
        FROM tbl
      

      【讨论】:

        猜你喜欢
        • 2013-05-18
        • 2022-11-17
        • 1970-01-01
        • 2016-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-28
        • 1970-01-01
        相关资源
        最近更新 更多