我有一個像這樣的以下查詢
SELECT REGEXP_SUBSTR('SARAH;10,JOE;1D,KANE;1A,SDF:1a', '[^,;] ', 1, level)
FROM dual
CONNECT BY REGEXP_SUBSTR('SARAH;10,JOE;1D,KANE;1A,SDF:1a',
'[^,;] ',
1,
level) IS NOT NULL;
我正在嘗試將 o/p 作為SARAH,JOE,KANE,SDF
uj5u.com熱心網友回復:
如果只有一行資料,那么您可以使用
WITH t(str) AS
(
SELECT 'SARAH;10,JOE;1D,KANE;1A,SDF:1a' FROM dual
), t2 AS
(
SELECT level AS lvl, REGEXP_SUBSTR(str, '[^,;:] ', 1, level) AS str
FROM t
CONNECT BY REGEXP_SUBSTR(str,
'[^,;] ',
1,
level) IS NOT NULL
)
SELECT LISTAGG(str,',') WITHIN GROUP (ORDER BY lvl) AS result
FROM t2
WHERE NOT REGEXP_LIKE(str,'^(\d)')
為了過濾提取的不以整數開頭的子字串,通過使用REGEXP_LIKE()上面的方法
uj5u.com熱心網友回復:
不要拆分字串并重新聚合。只需替換每個字串;或:直到下一個,或字串結尾的字串:
SELECT REGEXP_REPLACE(
'SARAH;10,JOE;1D,KANE;1A,SDF:1a',
'[;:].*?(,|$)',
'\1'
) AS replaced_value
FROM DUAL;
哪個輸出:
REPLACED_VALUE 莎拉,喬,凱恩,SDF
db<>在這里擺弄
更新
如果您的分隔符可以是任何一個;:,字符,直到下一個;:,字符或字串結尾,則:
SELECT value,
RTRIM(REGEXP_REPLACE(value, '[;:,].*?([;:,]|$)', ','), ',')
AS replaced_value
FROM table_name;
其中,對于樣本資料:
CREATE TABLE table_name (value) AS
SELECT 'SARAH;10,JOE;1D,KANE;1A,SDF:1a' FROM DUAL UNION ALL
SELECT 'SARAH,10;JOE,1D;KANE,1A;SDF:1a' FROM DUAL;
輸出:
價值 REPLACED_VALUE 莎拉;10,喬;1D,凱恩;1A,SDF:1a 莎拉,喬,凱恩,SDF 莎拉,10;喬,1D;凱恩,1A;SDF:1a 莎拉,喬,凱恩,SDF
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/448729.html
上一篇:如何在oraclesql中的一行上記錄來自不同行的資料
下一篇:來自程序PL/SQL的REF游標
