0

我有一个 varchar 列,其中可能包含如下格式:

123,124,125,126

现在我想获取所有数字并将其放在 select 命令中的单个列中

123
124
125
126

任何的想法?

4

3 回答 3

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;
于 2013-11-11T08:59:28.370 回答
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;
于 2013-11-11T08:53:23.217 回答
0

或者; substr, instr,lagregexp_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
  );

Rextester 演示

于 2018-10-26T18:27:40.183 回答