[SQL] 분할 문자열 행 오라클 SQL로
SQL분할 문자열 행 오라클 SQL로
포럼을 검색 한 후 나는 다음과 같은 있지만 작동하지 때우기 : /을
나는 다음과 테이블이;
ID | Strings
123| abc fgh dwd
243| dfs dfd dfg
353| dfs
424| dfd dfw
523|
.
.
.
이 있음을 내 다른 옵션은 약 2 만 행은 기본적으로 내가 지금 이런 각각의 행이 최대 문자열을 분할해야 ...이 작업을 수행하는 저장 프로 시저를 작성하지 않도록하십시오
ID | Strings
123| abc
123| fgh
123| dwd
243| dfs
등등...
이것은 내가 가지고있는 것입니다.
create table Temp AS
SELECT ID, strings
From mytable;
SELECT DISTINCT ID, trim(regexp_substr(str, '[^ ]+', 1, level)) str
FROM (SELECT ID, strings str FROM temp) t
CONNECT BY instr(str, ' ', 1, level -1) >0
ORDER BY ID;
어떤 도움에 감사드립니다
해결법
-
==============================
1.이 트릭을 수행해야합니다
이 트릭을 수행해야합니다
SELECT DISTINCT ID, regexp_substr("Strings", '[^ ]+', 1, LEVEL) FROM T CONNECT BY regexp_substr("Strings", '[^ ]+', 1, LEVEL) IS NOT NULL ORDER BY ID;
나도 절에 의해 연결에 REGEXP_SUBSTR 사용하는 방법을 알 수 있습니다. 이것은 여러 공간의 경우 처리하는 것입니다.
당신이 예측이있는 경우 상단 줄에 항목의 수에 결합, 그것은 가치가 간단한 십자가 위의 재귀 쿼리의 성능을 비교 수도 가입 :
WITH N as (SELECT LEVEL POS FROM DUAL CONNECT BY LEVEL < 10) -- ^^ -- up to 10 substrings SELECT ID, regexp_substr("Strings", '[^ ]+', 1, POS) FROM T CROSS JOIN N WHERE regexp_substr("Strings", '[^ ]+', 1, POS) IS NOT NULL ORDER BY ID;
라이브 데모 http://sqlfiddle.com/#!4/444e3/1를 참조하십시오
-
==============================
2.더 유연하고 더 나은 솔루션한다 :
더 유연하고 더 나은 솔루션한다 :
XMLTABLE 및 MODEL 절을 사용하여 다른 사례가있다, 분할 쉼표 테이블에서 문자열을 구분하시기 바랍니다.
예를 들어,
ID 열없이 :
SQL> WITH T AS 2 (SELECT 'abc fgh dwd' AS text FROM dual 3 UNION 4 SELECT 'dfs dfd dfg' AS text FROM dual 5 UNION 6 SELECT 'dfs' AS text FROM Dual 7 UNION 8 SELECT 'dfd dfw' AS text FROM dual 9 ) 10 SELECT trim(regexp_substr(t.text, '[^ ]+', 1, lines.column_value)) text 11 FROM t, 12 TABLE (CAST (MULTISET 13 (SELECT LEVEL FROM dual CONNECT BY instr(t.text, ' ', 1, LEVEL - 1) > 0 14 ) AS sys.odciNumberList )) lines 15 / TEXT ----------- abc fgh dwd dfd dfw dfs dfs dfd dfg 9 rows selected.
ID 컬럼 :
SQL> WITH T AS 2 (SELECT 123 AS id, 'abc fgh dwd' AS text FROM dual 3 UNION 4 SELECT 243 AS id, 'dfs dfd dfg' AS text FROM dual 5 UNION 6 SELECT 353 AS Id, 'dfs' AS text FROM Dual 7 UNION 8 SELECT 424 AS id, 'dfd dfw' AS text FROM dual 9 ) 10 SELECT id, trim(regexp_substr(t.text, '[^ ]+', 1, lines.column_value)) text 11 FROM t, 12 TABLE (CAST (MULTISET 13 (SELECT LEVEL FROM dual CONNECT BY instr(t.text, ' ', 1, LEVEL - 1) > 0 14 ) AS sys.odciNumberList )) lines 15 ORDER BY id 16 / ID TEXT ---------- ----------- 123 abc 123 fgh 123 dwd 243 dfs 243 dfd 243 dfg 353 dfs 424 dfd 424 dfw 9 rows selected. SQL>
-
==============================
3.
With T As (select 123 as id, 'abc fgh dwd' as strings from dual union select 243 as id, 'dfs dfd dfg' as strings from dual union Select 353 As Id, 'dfs' As Strings From Dual union select 424 as id, 'dfd dfw' as strings from dual ) select distinct id, REGEXP_SUBSTR (Replace(Strings, ' ', ','), '[^,]+', 1, level) as Strings from t Connect By Level <= Length(Regexp_Replace(Replace(Strings, ' ', ','),'[^,]*'))+1 order by id, strings; **********OUTPUT************* ID STRINGS ---------- ----------- 123 abc 123 dwd 123 fgh 243 dfd 243 dfg 243 dfs 353 dfs 424 dfd 424 dfw 9 rows selected
from https://stackoverflow.com/questions/26407538/split-string-into-rows-oracle-sql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL에 소계 행을 추가하는 방법 [마감] (0) | 2020.05.25 |
---|---|
[SQL] 어떻게 하나 개의 레코드에 SQL에 널 (null) 값으로 모든 필드를 계산하려면? (0) | 2020.05.25 |
[SQL] C # SQL 삽입 명령 (0) | 2020.05.24 |
[SQL] 두 번째 필드를 자동 증가로 두 필드의 SQL 서버 고유 복합 키 (0) | 2020.05.24 |
[SQL] 동적으로 생성 된 테이블에서 엔티티 프레임 워크를 사용하여 데이터를 쿼리 (0) | 2020.05.24 |