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.