首页 > 解决方案 > 如何在Oracle中通过分隔符拆分查询数据?

问题描述

我有以下行 A1,A2,A3;A4,A5,A6 我想将此数据查询为 2 行:A1,A2,A3 和 A4,A5,A6

下面的查询返回多行 A1、A2、A3:

select regexp_substr(value, '[^;]+', 1, level)
from some_table 
where some_id = 8
connect by regexp_substr(value, '[^;]+', 1, level) is not null
;

标签: sqloracle

解决方案


您可以使用递归子查询因式分解子句和简单的字符串函数(而不是慢速正则表达式)来做到这一点。

(注意:这也没有分层查询在有多个输入行时会产生的问题,因为它无法将每一行与其父行关联起来,因此它无法将每一行与其父行关联起来,因此它将与先前层次结构中的所有行关联起来等级。)

甲骨文设置

CREATE TABLE some_table( some_id, value ) AS
  SELECT 8, 'A1,A2,A3;A4,A5,A6' FROM DUAL UNION ALL
  SELECT 8, 'B1,B2,B3;B4,B5,B6' FROM DUAL UNION ALL
  SELECT 8, 'C1,C2,C3;C4,C5,C6' FROM DUAL;

查询

WITH line_start_end ( some_id, value, startidx, endidx ) AS (
  SELECT some_id,
         value,
         1,
         INSTR( value, ';', 1 )
  FROM   some_table
  WHERE  some_id = 8
UNION ALL
  SELECT some_id,
         value,
         endidx + 1,
         INSTR( value, ';', endidx + 1 )
  FROM   line_start_end
  WHERE  endidx > 0
)
SELECT some_id,
       CASE
       WHEN endidx = 0
       THEN SUBSTR( value, startidx )
       ELSE SUBSTR( value, startidx, endidx - startidx )
       END AS value
FROM   line_start_end;

输出

SOME_ID | 价值   
------: | :--------
      8 | A1,A2,A3
      8 | B1,B2,B3
      8 | C1,C2,C3
      8 | A4,A5,A6
      8 | B4,B5,B6
      8 | C4,C5,C6

db<>在这里摆弄


推荐阅读