- 단순히 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에 따라 다릅니다. 분할 함수의 구현이 있습니다 (많은 언어와 비슷합니다). 구분 기호로', '를 사용하여 각 테이블 레코드 (필드)에 대해 호출해야합니다. DBMS에서 사용할 수 없다면 간단한 배열/커서/결과 집합을 반환하는 간단한 함수를 작성할 수 있습니다. – FDavidov
사용중인 dbms에 태그를 지정하십시오. – jarlh
처음부터 쉼표로 분리 된 값을 SQL 테이블에 저장하지 않으면 많은 두통을 예방할 수 있습니다. 데이타베이스를 제어 할 수있는 것처럼 보입니다. 완전히 피할 수있는 문제에 대한 대안을 만드는 데 시간을 낭비하지 말고 올바르게 설계하십시오. – Tomalak