복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    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 
    
  4. from https://stackoverflow.com/questions/26407538/split-string-into-rows-oracle-sql by cc-by-sa and MIT license