【问题标题】:get numbers from string delimiter by ',' in oracle sql在oracle sql中通过','从字符串分隔符中获取数字
【发布时间】:2013-11-11 08:39:15
【问题描述】:

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

123,124,125,126

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

123
124
125
126

有什么想法吗?

【问题讨论】:

标签: sql regex oracle


【解决方案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;

【讨论】:

  • 假设问题'123,124,125,126,' ==最后一个逗号。你返回一个空行。
  • @realspirituals,感谢您的指出,我已经添加了另一个答案来克服类似的问题。
【解决方案2】:

回答无数次...

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;

【讨论】:

    【解决方案3】:

    或者; substrinstrlagregexp_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 Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      • 2018-05-05
      • 2011-03-29
      • 1970-01-01
      • 2015-02-27
      相关资源
      最近更新 更多