Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Mengurai string yang dibatasi pipa menjadi kolom?

Anda dapat menggunakan 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

Dengan loop di 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

Perbarui

Anda hanya memiliki 12 kolom, saya akan menulis kueri secara langsung tanpa loop, itu akan lebih berkinerja dan lebih mudah dipelihara daripada SQL dinamis (belum lagi jauh lebih mudah untuk ditulis):

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hasilkan Prosedur PL/SQL Online untuk Mengimpor Data di Tabel Oracle

  2. Bagaimana cara menulis kueri yang melakukan sesuatu yang mirip dengan GROUP_CONCAT MySQL di Oracle?

  3. Fungsi JSON_ARRAYAGG() di Oracle

  4. INSERT dan UPDATE catatan menggunakan kursor di oracle

  5. 19.3 PDB Tutup ORA-65107 ORA-16078