我有一个varchar collumn,它可能包含这样的格式:
123124125126
现在我想获取所有数字,并将它放在select list
中的这一列中123
124个
125个
126
有什么想法吗?
答案 0 :(得分:1)
试试这个,
with test as
(
SELECT '123,124,125,126' str FROM dual
)
SELECT regexp_substr (str, '[^,]+', 1, ROWNUM) SPLIT
FROM TEST
CONNECT BY LEVEL <= LENGTH (regexp_replace (str, '[^,]+')) + 1;
如果最后还有一个额外的逗号,请尝试此操作
with test as
(
SELECT '123,124,125,126,' str FROM dual
)
SELECT regexp_substr(str,'[^,]+', 1, LEVEL) FROM test
connect by regexp_substr(str, '[^,]+', 1, level) is not null;
答案 1 :(得分:0)
无数次回答......
WITH CTE
AS (SELECT
'123,124,125,126' AS COL1
FROM
DUAL)
SELECT
REGEXP_SUBSTR ( COL1,
'[^,]+',
1,
RN )
COL1
FROM
CTE
CROSS JOIN
(SELECT
ROWNUM RN
FROM
(SELECT
MAX ( LENGTH ( REGEXP_REPLACE ( COL1,
'[^,]+' ) ) )
+ 1
MAX_L
FROM
CTE)
CONNECT BY
LEVEL <= MAX_L)
WHERE
REGEXP_SUBSTR ( COL1,
'[^,]+',
1,
RN )
IS NOT NULL
ORDER BY
COL1;
答案 2 :(得分:0)
或者; substr
,instr
,lag
和regexp_count
在一起:
select substr(str,second,first-second) as "Result String"
from
(
with t(str) as
(
select '123,124,125,126' from dual
)
select replace(instr(str,',',1,level),0,length(str)+1) first,
nvl(lag(instr(str,',',1,level)) over (order by level),0)+1 second,
str
from dual
cross join ( select str from t )
connect by level <= regexp_count(str,',')+1
);