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

REGEX untuk memilih nilai ke-n dari daftar, memungkinkan untuk nol

Terima kasih kepada mereka yang menjawab. Setelah membaca dengan teliti jawaban Anda dan jawaban di tautan yang disediakan, saya sampai pada solusi ini:

SQL> select REGEXP_SUBSTR('1,,3,4,5', '(.*?)(,|$)', 1, 2, NULL, 1) data
  2  from dual;

Data
----

Yang dapat digambarkan sebagai "lihat kemunculan ke-2 dari kumpulan opsional nol atau lebih karakter yang diikuti oleh koma atau akhir baris, dan kembalikan subgrup ke-1 (yang merupakan data dikurangi koma atau akhir dari baris).

Saya lupa menyebutkan bahwa saya menguji dengan nol di berbagai posisi, banyak nol, memilih berbagai posisi, dll.

Satu-satunya peringatan yang dapat saya temukan adalah jika bidang yang Anda cari lebih besar dari jumlah yang tersedia, itu hanya mengembalikan NULL sehingga Anda harus menyadarinya. Tidak masalah untuk kasus saya.

EDIT:Saya memperbarui jawaban yang diterima untuk kepentingan pencari masa depan yang mungkin menemukan ini.

Langkah selanjutnya adalah mengenkapsulasi kode sehingga dapat dibuat menjadi fungsi yang lebih sederhana dan dapat digunakan kembali. Berikut adalah sumber fungsinya:

  FUNCTION  GET_LIST_ELEMENT(string_in VARCHAR2, element_in NUMBER, delimiter_in VARCHAR2 DEFAULT ',') RETURN VARCHAR2 IS
    BEGIN
      RETURN REGEXP_SUBSTR(string_in, '(.*?)(\'||delimiter_in||'|$)', 1, element_in, NULL, 1);
  END GET_LIST_ELEMENT;

Ini menyembunyikan kompleksitas regex dari pengembang yang mungkin tidak begitu nyaman dengannya dan membuat kode tetap bersih saat digunakan. Sebut saja seperti ini untuk mendapatkan elemen ke-4:

select get_list_element('123,222,,432,555', 4) 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. Cari database Oracle untuk tabel dengan nama kolom tertentu?

  2. Pilih dari tabel jika catatan ditemukan di tabel lain

  3. ORA-24247:akses jaringan ditolak oleh daftar kontrol akses (ACL)

  4. masalah ORA-00001:batasan unik dilanggar masuk INSERT/UPDATE

  5. Pengembang SQL 4.1.2