sql - 如何在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
;
解决方案
您可以使用递归子查询因式分解子句和简单的字符串函数(而不是慢速正则表达式)来做到这一点。
(注意:这也没有分层查询在有多个输入行时会产生的问题,因为它无法将每一行与其父行关联起来,因此它无法将每一行与其父行关联起来,因此它将与先前层次结构中的所有行关联起来等级。)
甲骨文设置:
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<>在这里摆弄
推荐阅读
- javascript - JavaScript,同一函数的单独实例为同一封闭变量返回不同的值
- c# - Orleans - 自定义 TCP 套接字连接
- r - R group_by 行和每列的总和值
- python - 检查两个不同 csv 文件中的相同列值
- mysql - 优化 MySQL InnoDB 查询最大值,计数
- mongodb - 集合引用多个集合
- postman - 如何使用 avj 和 postman 验证 json 架构
- google-sheets - 谷歌电子表格的谷歌脚本,给定两个特定的工作表名称,将日期从工作表 2 更新到工作表 1
- ios - 从 Firestore 查询数组
- html - Gmail 用标签包装了随机的 html 元素