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

Memisahkan string menjadi beberapa baris di Oracle

Ini mungkin cara yang lebih baik (juga dengan regexp dan connect by):

with temp as
(
    select 108 Name, 'test' Project, 'Err1, Err2, Err3' Error  from dual
    union all
    select 109, 'test2', 'Err1' from dual
)
select distinct
  t.name, t.project,
  trim(regexp_substr(t.error, '[^,]+', 1, levels.column_value))  as error
from 
  temp t,
  table(cast(multiset(select level from dual connect by  level <= length (regexp_replace(t.error, '[^,]+'))  + 1) as sys.OdciNumberList)) levels
order by name

EDIT :Ini adalah penjelasan sederhana (seperti dalam, "tidak mendalam") dari kueri.

  1. length (regexp_replace(t.error, '[^,]+')) + 1 menggunakan regexp_replace untuk menghapus apa pun yang bukan pembatas (dalam hal ini koma) dan length +1 untuk mendapatkan berapa banyak elemen (kesalahan) yang ada.
  2. select level from dual connect by level <= (...) menggunakan kueri hierarki untuk membuat kolom dengan peningkatan jumlah kecocokan yang ditemukan, dari 1 hingga jumlah total kesalahan.

    Pratinjau:

    select level, length (regexp_replace('Err1, Err2, Err3', '[^,]+'))  + 1 as max 
    from dual connect by level <= length (regexp_replace('Err1, Err2, Err3', '[^,]+'))  + 1
    
  3. table(cast(multiset(.....) as sys.OdciNumberList)) melakukan beberapa casting tipe oracle.
    • Pemeran cast(multiset(.....)) as sys.OdciNumberList mengubah beberapa koleksi (satu koleksi untuk setiap baris dalam kumpulan data asli) menjadi satu kumpulan angka, OdciNumberList.
    • table() fungsi mengubah koleksi menjadi hasil.
  4. FROM tanpa gabungan akan membuat gabung silang antara set data Anda dan multiset. Akibatnya, satu baris dalam set data dengan 4 kecocokan akan berulang 4 kali (dengan angka yang meningkat di kolom bernama "column_value").

    Pratinjau:

    select * from 
    temp t,
    table(cast(multiset(select level from dual connect by  level <= length (regexp_replace(t.error, '[^,]+'))  + 1) as sys.OdciNumberList)) levels
    
  5. trim(regexp_substr(t.error, '[^,]+', 1, levels.column_value)) menggunakan column_value sebagai nth_appearance/ocurrence parameter untuk regexp_substr .
  6. Anda dapat menambahkan beberapa kolom lain dari kumpulan data Anda (t.name, t.project sebagai contoh) untuk visualisasi yang mudah.

Beberapa referensi ke dokumen Oracle:

  • REGEXP_REPLACE
  • REGEXP_SUBSTR
  • Konstanta, Jenis, dan Pemetaan Ekstensibilitas (OdciNumberList)
  • CAST (multiset)
  • Kueri Hirarki


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tabel Sementara Lokal di Oracle 10 (untuk ruang lingkup Prosedur Tersimpan)

  2. Kesalahan SQL:ORA-00933:Perintah SQL tidak berakhir dengan benar

  3. Mengelompokkan catatan jam demi jam atau hari demi hari dan mengisi celah dengan nol atau nol

  4. Mengapa Oracle 10g tidak mengeluh tentang ambiguitas kolom?

  5. Normalisasikan data transaksi dari kolom waktu dan status menjadi menit per nilai status