Như Phil đã lưu ý, chuỗi rỗng được coi là NULL và NULL không bằng hoặc không bằng với bất kỳ thứ gì. Nếu bạn mong đợi chuỗi trống hoặc NULL, bạn sẽ cần xử lý những chuỗi đó bằng 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;
/
Liên quan đến so sánh rỗng:
Theo tài liệu Oracle 12c về NULLS, so sánh rỗng sử dụng IS NULL
hoặc IS NOT NULL
đánh giá thành TRUE
hoặc FALSE
. Tuy nhiên, tất cả các so sánh khác đều đánh giá thành UNKNOWN
, không FALSE
. Tài liệu cho biết thêm:
Một điều kiện đánh giá UNKNOWN hoạt động gần giống như FALSE. Ví dụ, một câu lệnh SELECT với một điều kiện trong mệnh đề WHERE đánh giá là UNKNOWN trả về không có hàng nào. Tuy nhiên, một điều kiện đánh giá thành UNKNOWN khác với FALSE ở chỗ các thao tác tiếp theo trên một đánh giá điều kiện UNKNOWN sẽ đánh giá thành UNKNOWN. Do đó, NOT FALSE đánh giá là TRUE, nhưng NOT UNKNOWN đánh giá là UNKNOWN.
Một bảng tham chiếu được cung cấp bởi 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
Tôi cũng học được rằng chúng ta không nên viết PL / SQL giả sử các chuỗi trống sẽ luôn được đánh giá là NULL:
Cơ sở dữ liệu Oracle hiện coi một giá trị ký tự có độ dài bằng 0 là null. Tuy nhiên, điều này có thể không tiếp tục đúng trong các bản phát hành trong tương lai và Oracle khuyên bạn không nên coi các chuỗi trống giống như chuỗi rỗng.