2017-08-16 125 views
1

我已经使用了功能regexp_substr(STR,'[^|]+',1,2), 它运作良好,在某些情况下,但对于空的场景,它给人的第三个值空值,ORACLE - REGEXP_SUBSTR返回

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) 

回答

2

@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    
1

您的功能正在返回正确的结果。当你在

6||LION|TIGER

甲骨文运行功能,

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

没有找到||之间的任何 '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