在Oracle中你可以使用类似的东西(也许它不是最优雅,但它给你想要的结果) - 简单地用your_table_name更换tab
:
WITH
tab2 AS (
SELECT t.field,
CASE WHEN INSTR(t.field, ',', 1, 1) > 0 AND regexp_count(t.field,',') >= 1 THEN INSTR(t.field, ',', 1, 1) ELSE NULL END AS pos1,
CASE WHEN INSTR(t.field, ',', 1, 2) > 0 AND regexp_count(t.field,',') >= 2 THEN INSTR(t.field, ',', 1, 2) ELSE NULL END AS pos2,
CASE WHEN INSTR(t.field, ',', 1, 3) > 0 AND regexp_count(t.field,',') >= 3 THEN INSTR(t.field, ',', 1, 3) ELSE NULL END AS pos3,
CASE WHEN INSTR(t.field, ',', 1, 4) > 0 AND regexp_count(t.field,',') >= 4 THEN INSTR(t.field, ',', 1, 4) ELSE NULL END AS pos4,
CASE WHEN INSTR(t.field, ',', 1, 5) > 0 AND regexp_count(t.field,',') >= 5 THEN INSTR(t.field, ',', 1, 5) ELSE NULL END AS pos5,
CASE WHEN INSTR(t.field, ',', 1, 6) > 0 AND regexp_count(t.field,',') >= 6 THEN INSTR(t.field, ',', 1, 6) ELSE NULL END AS pos6
FROM tab t
),
tab3 AS (
SELECT SUBSTR(tt.field,1,tt.pos1-1) AS col1,
SUBSTR(tt.field,tt.pos1+1, CASE WHEN tt.pos2 IS NULL THEN LENGTH(tt.field) - tt.pos1 ELSE tt.pos2 - tt.pos1 - 1 END) AS col2,
SUBSTR(tt.field,tt.pos2+1, CASE WHEN tt.pos3 IS NULL THEN LENGTH(tt.field) - tt.pos2 ELSE tt.pos3 - tt.pos2 - 1 END) AS col3,
SUBSTR(tt.field,tt.pos3+1, CASE WHEN tt.pos4 IS NULL THEN LENGTH(tt.field) - tt.pos3 ELSE tt.pos4 - tt.pos3 - 1 END) AS col4,
SUBSTR(tt.field,tt.pos4+1, CASE WHEN tt.pos5 IS NULL THEN LENGTH(tt.field) - tt.pos4 ELSE tt.pos5 - tt.pos4 - 1 END) AS col5,
SUBSTR(tt.field,tt.pos5+1, CASE WHEN tt.pos6 IS NULL THEN LENGTH(tt.field) - tt.pos5 ELSE tt.pos6 - tt.pos5 - 1 END) AS col6
,ROWNUM AS r
FROM tab2 tt
),
tab4 AS (
SELECT ttt.col1 AS col FROM tab3 ttt WHERE r = 1
UNION ALL SELECT ttt.col2 FROM tab3 ttt WHERE r = 1
UNION ALL SELECT ttt.col3 FROM tab3 ttt WHERE r = 1
UNION ALL SELECT ttt.col4 FROM tab3 ttt WHERE r = 1
UNION ALL SELECT ttt.col5 FROM tab3 ttt WHERE r = 1
UNION ALL SELECT ttt.col6 FROM tab3 ttt WHERE r = 1
UNION ALL
SELECT ttt.col1 FROM tab3 ttt WHERE r = 2
UNION ALL SELECT ttt.col2 FROM tab3 ttt WHERE r = 2
UNION ALL SELECT ttt.col3 FROM tab3 ttt WHERE r = 2
UNION ALL SELECT ttt.col4 FROM tab3 ttt WHERE r = 2
UNION ALL SELECT ttt.col5 FROM tab3 ttt WHERE r = 2
UNION ALL SELECT ttt.col6 FROM tab3 ttt WHERE r = 2
UNION ALL
SELECT ttt.col1 FROM tab3 ttt WHERE r = 3
UNION ALL SELECT ttt.col2 FROM tab3 ttt WHERE r = 3
UNION ALL SELECT ttt.col3 FROM tab3 ttt WHERE r = 3
UNION ALL SELECT ttt.col4 FROM tab3 ttt WHERE r = 3
UNION ALL SELECT ttt.col5 FROM tab3 ttt WHERE r = 3
UNION ALL SELECT ttt.col6 FROM tab3 ttt WHERE r = 3
UNION ALL
SELECT ttt.col1 FROM tab3 ttt WHERE r = 4
UNION ALL SELECT ttt.col2 FROM tab3 ttt WHERE r = 4
UNION ALL SELECT ttt.col3 FROM tab3 ttt WHERE r = 4
UNION ALL SELECT ttt.col4 FROM tab3 ttt WHERE r = 4
UNION ALL SELECT ttt.col5 FROM tab3 ttt WHERE r = 4
UNION ALL SELECT ttt.col6 FROM tab3 ttt WHERE r = 4
UNION ALL
SELECT ttt.col1 FROM tab3 ttt WHERE r = 5
UNION ALL SELECT ttt.col2 FROM tab3 ttt WHERE r = 5
UNION ALL SELECT ttt.col3 FROM tab3 ttt WHERE r = 5
UNION ALL SELECT ttt.col4 FROM tab3 ttt WHERE r = 5
UNION ALL SELECT ttt.col5 FROM tab3 ttt WHERE r = 5
UNION ALL SELECT ttt.col6 FROM tab3 ttt WHERE r = 5
)
SELECT col
FROM tab4
WHERE col IS NOT NULL
它给我的结果:
1 Hello
2 world
3 !
4 Haloa
5 !
6 Have
7 a
8 nice
9 day
10 !
取决于您的DBMS。有一些分割函数的实现(很像很多语言中的),你需要为每个表格记录(字段)调用','作为分隔符。如果您的数据库管理系统中不可用,您可以编写一个简单的函数来返回一个简单的数组/游标/结果集。 – FDavidov
标记您正在使用的dbms。 – jarlh
首先不将逗号分隔的值存储到SQL表中可防止许多问题。您似乎可以控制数据库 - 正确设计它,而不是浪费时间创建可完全避免的问题的解决方法。 – Tomalak