我已经使用了功能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