我已經使用了功能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)
我已經使用了功能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)
@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
您的功能正在返回正確的結果。當你在
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