Split function in oracle to comma separated values with automatic sequence

后端 未结 8 979
遇见更好的自我
遇见更好的自我 2020-11-28 09:37

Need Split function which will take two parameters, string to split and delimiter to split the string and return a table with columns Id and Data.And how to call Split funct

8条回答
  •  一整个雨季
    2020-11-28 10:21

    There are multiple options. See Split single comma delimited string into rows in Oracle

    You just need to add LEVEL in the select list as a column, to get the sequence number to each row returned. Or, ROWNUM would also suffice.

    Using any of the below SQLs, you could include them into a FUNCTION.

    INSTR in CONNECT BY clause:

    SQL> WITH DATA AS
      2    ( SELECT 'word1, word2, word3, word4, word5, word6' str FROM dual
      3    )
      4  SELECT trim(regexp_substr(str, '[^,]+', 1, LEVEL)) str
      5  FROM DATA
      6  CONNECT BY instr(str, ',', 1, LEVEL - 1) > 0
      7  /
    
    STR
    ----------------------------------------
    word1
    word2
    word3
    word4
    word5
    word6
    
    6 rows selected.
    
    SQL>
    

    REGEXP_SUBSTR in CONNECT BY clause:

    SQL> WITH DATA AS
      2    ( SELECT 'word1, word2, word3, word4, word5, word6' str FROM dual
      3    )
      4  SELECT trim(regexp_substr(str, '[^,]+', 1, LEVEL)) str
      5  FROM DATA
      6  CONNECT BY regexp_substr(str , '[^,]+', 1, LEVEL) IS NOT NULL
      7  /
    
    STR
    ----------------------------------------
    word1
    word2
    word3
    word4
    word5
    word6
    
    6 rows selected.
    
    SQL>
    

    REGEXP_COUNT in CONNECT BY clause:

    SQL> WITH DATA AS
      2        ( SELECT 'word1, word2, word3, word4, word5, word6' str FROM dual
      3        )
      4      SELECT trim(regexp_substr(str, '[^,]+', 1, LEVEL)) str
      5      FROM DATA
      6      CONNECT BY LEVEL 
    

    Using XMLTABLE

    SQL> WITH DATA AS
      2    ( SELECT 'word1, word2, word3, word4, word5, word6' str FROM dual
      3    )
      4  SELECT trim(COLUMN_VALUE) str
      5    FROM DATA, xmltable(('"' || REPLACE(str, ',', '","') || '"'))
      6  /
    STR
    ------------------------------------------------------------------------
    word1
    word2
    word3
    word4
    word5
    word6
    
    6 rows selected.
    
    SQL>
    

    Using MODEL clause:

    SQL> WITH t AS
      2  (
      3         SELECT 'word1, word2, word3, word4, word5, word6' str
      4         FROM   dual ) ,
      5  model_param AS
      6  (
      7         SELECT str AS orig_str ,
      8                ','
      9                       || str
     10                       || ','                                 AS mod_str ,
     11                1                                             AS start_pos ,
     12                Length(str)                                   AS end_pos ,
     13                (Length(str) - Length(Replace(str, ','))) + 1 AS element_count ,
     14                0                                             AS element_no ,
     15                ROWNUM                                        AS rn
     16         FROM   t )
     17  SELECT   trim(Substr(mod_str, start_pos, end_pos-start_pos)) str
     18  FROM     (
     19                  SELECT *
     20                  FROM   model_param MODEL PARTITION BY (rn, orig_str, mod_str)
     21                  DIMENSION BY (element_no)
     22                  MEASURES (start_pos, end_pos, element_count)
     23                  RULES ITERATE (2000)
     24                  UNTIL (ITERATION_NUMBER+1 = element_count[0])
     25                  ( start_pos[ITERATION_NUMBER+1] = instr(cv(mod_str), ',', 1, cv(element_no)) + 1,
     26                  end_pos[iteration_number+1] = instr(cv(mod_str), ',', 1, cv(element_no) + 1) ) )
     27  WHERE    element_no != 0
     28  ORDER BY mod_str ,
     29           element_no
     30  /
    
    STR
    ------------------------------------------
    word1
    word2
    word3
    word4
    word5
    word6
    
    6 rows selected.
    
    SQL>
    

    You could also use DBMS_UTILITY package provided by Oracle. It provides various utility subprograms. One such useful utility is COMMA_TO_TABLE procedure, which converts a comma-delimited list of names into a PL/SQL table of names.

    Read DBMS_UTILITY.COMMA_TO_TABLE

提交回复
热议问题