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

Masalah perbandingan string Oracle PL/SQL

Seperti yang dicatat Phil, string kosong diperlakukan sebagai NULL, dan NULL tidak sama atau tidak sama dengan apa pun. Jika Anda mengharapkan string kosong atau NULL, Anda harus menanganinya dengan NVL() :

 DECLARE
 str1  varchar2(4000);
 str2  varchar2(4000);
 BEGIN
   str1:='';
   str2:='sdd';
-- Provide an alternate null value that does not exist in your data:
   IF(NVL(str1,'X') != NVL(str2,'Y')) THEN
    dbms_output.put_line('The two strings are not equal');
   END IF;
 END;
 /

Mengenai perbandingan nol:

Menurut dokumentasi Oracle 12c tentang NULLS, perbandingan nol menggunakan IS NULL atau IS NOT NULL lakukan evaluasi ke TRUE atau FALSE . Namun, semua perbandingan lainnya dievaluasi menjadi UNKNOWN , tidak FALSE . Dokumentasi lebih lanjut menyatakan:

Suatu kondisi yang mengevaluasi ke UNKNOWN bertindak hampir seperti FALSE. Misalnya, pernyataan SELECT dengan kondisi dalam klausa WHERE yang mengevaluasi ke UNKNOWN tidak mengembalikan baris. Namun, kondisi yang mengevaluasi UNKNOWN berbeda dari FALSE dalam operasi lebih lanjut pada evaluasi kondisi UNKNOWN akan mengevaluasi ke UNKNOWN. Jadi, NOT FALSE dievaluasi menjadi TRUE, tetapi NOT UNKNOWN dievaluasi menjadi UNKNOWN.

Tabel referensi disediakan oleh Oracle:

Condition       Value of A    Evaluation
----------------------------------------
a IS NULL       10            FALSE
a IS NOT NULL   10            TRUE        
a IS NULL       NULL          TRUE
a IS NOT NULL   NULL          FALSE
a = NULL        10            UNKNOWN
a != NULL       10            UNKNOWN
a = NULL        NULL          UNKNOWN
a != NULL       NULL          UNKNOWN
a = 10          NULL          UNKNOWN
a != 10         NULL          UNKNOWN

Saya juga belajar bahwa kita tidak boleh menulis PL/SQL dengan asumsi string kosong akan selalu dievaluasi sebagai NULL:

Oracle Database saat ini memperlakukan nilai karakter dengan panjang nol sebagai null. Namun, hal ini mungkin tidak berlanjut pada rilis mendatang, dan Oracle menyarankan agar Anda tidak memperlakukan string kosong sama dengan null.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Membandingkan Tanggal di Oracle SQL

  2. LISTAGG Query ORA-00937:bukan fungsi grup grup tunggal

  3. Kode untuk memanggil fungsi dalam paket dari C# dan ODP.NET

  4. Hasil tidak berurutan dalam SQL

  5. Cara memanggil prosedur tanpa parameter sebagai tipe tabel dari kelas Java