sql >> データベース >  >> RDS >> Oracle

パイプで区切られた文字列を列に解析しますか?

    regexp_substrを使用できます (10g以上):

    SQL> SELECT regexp_substr('23|12.1| 450|30|9|', '[^|]+', 1, 1) c1,
      2         regexp_substr('23|12.1| 450|30|9|', '[^|]+', 1, 2) c2,
      3         regexp_substr('23|12.1| 450|30|9|', '[^|]+', 1, 3) c3
      4    FROM dual;
    
    C1 C2   C3
    -- ---- ----
    23 12.1  450
    

    PL / SQLのループあり:

    SQL> SET SERVEROUTPUT ON
    SQL> DECLARE
      2     p_tsv  VARCHAR2(1000) := '23|12.1| 450|30|9|78|82.5|92.1|120|185|52|11';
      3     l_item VARCHAR2(100);
      4  BEGIN
      5     FOR i IN 1 .. length(p_tsv) - length(REPLACE(p_tsv, '|', '')) + 1 LOOP
      6        l_item := regexp_substr(p_tsv, '[^|]+', 1, i);
      7        dbms_output.put_line(l_item);
      8     END LOOP;
      9  END;
     10  /
    
    23
    12.1
    450
    30
    9
    78
    82.5
    92.1
    120
    185
    52
    11
    
    PL/SQL procedure successfully completed
    

    更新

    あなたはのみ 12列あるので、ループなしで直接クエリを記述します。動的SQLよりもパフォーマンスが高く、保守も簡単です(言うまでもなく、記述が非常に簡単です):

    INSERT INTO your_table
       (ID, month1, month2, month3...)
       SELECT :p_id, 
              regexp_substr(:p_tsv, '[^|]+', 1, 1) c1, 
              regexp_substr(:p_tsv, '[^|]+', 1, 2) c2,
              regexp_substr(:p_tsv, '[^|]+', 1, 3) c3
              ...
         FROM dual;
    


    1. SQLで数値を最も近い整数に切り上げる方法

    2. java.lang.IllegalArgumentExceptionが発生するのはなぜですか。この場合、インデックス1のバインド値はnullです。

    3. 静的SQLと動的SQL

    4. PostgreSQL:実行中のクエリ並列処理