2017-08-16 54 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