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

CHR(0) dalam REGEXP_LIKE

CHR(0) adalah karakter yang digunakan untuk mengakhiri string dalam bahasa pemrograman C (antara lain).

Saat Anda melewati CHR(0) ke fungsi itu, pada gilirannya, akan meneruskannya ke fungsi tingkat yang lebih rendah yang akan mengurai string yang telah Anda lewati dan membangun pola ekspresi reguler dari string itu. Pola ekspresi reguler ini akan melihat CHR(0) dan anggap itu adalah terminator string dan abaikan sisa polanya.

Perilaku lebih mudah dilihat dengan REGEXP_REPLACE :

SELECT REGEXP_REPLACE( 'abc' || CHR(0) || 'e', CHR(0), 'd' )
FROM   DUAL;

Apa yang terjadi ketika Anda menjalankan ini:

  • CHR(0) dikompilasi menjadi ekspresi reguler dan menjadi terminator string.
  • Sekarang polanya hanyalah terminator string dan polanya adalah string dengan panjang nol.
  • Ekspresi reguler kemudian dicocokkan dengan string input dan membaca karakter pertama a dan menemukan string panjang nol dapat dicocokkan sebelum a jadi itu menggantikan yang tidak cocok sebelum a dengan d memberikan output da .
  • Ini kemudian akan diulang untuk karakter berikutnya yang mengubah b ke db .
  • dan seterusnya hingga Anda mencapai akhir string ketika itu akan cocok dengan pola panjang nol dan menambahkan d akhir .

Dan Anda akan mendapatkan output:

dadbdcd_ded

(di mana _ adalah CHR(0) karakter. )

Catatan:CHR(0) di input tidak diganti.

Jika program klien yang Anda gunakan juga memotong string di CHR(0) Anda mungkin tidak melihat seluruh output (ini adalah masalah dengan bagaimana klien Anda merepresentasikan string dan bukan dengan output Oracle) tetapi juga dapat ditampilkan menggunakan DUMP() :

SELECT DUMP( REGEXP_REPLACE( 'abc' || CHR(0) || 'e', CHR(0), 'd' ) )
FROM DUAL;

Keluaran:

Typ=1 Len=11: 100,97,100,98,100,99,100,0,100,101,100

[TL;DR] Jadi apa yang terjadi dengan

REGEXP_LIKE( '1234567890', CHR(0) )

Ini akan membuat pola ekspresi reguler string panjang nol dan akan mencari kecocokan panjang nol sebelum 1 karakter - yang akan ditemukan dan kemudian mengembalikan bahwa ia telah menemukan kecocokan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. bagaimana kita bisa mendapatkan nilai VARRAY dari IN Parameter dalam prosedur

  2. Mengonversi angka/angka dalam kata-kata untuk mata uang INR (Rupee India) di Oracle PL/SQL

  3. Bagaimana cara mengompres hasil Oracle ini menjadi nilai sesuai dengan prioritas baris, mengabaikan nol?

  4. Bagaimana cara menguji izin sistem file baca/tulis dari direktori Oracle?

  5. buat sinonim ora-01031 hak istimewa yang tidak mencukupi