COALESCE
là chức năng hiện đại hơn, là một phần của ANSI-92
tiêu chuẩn.
NVL
là Oracle
cụ thể, nó đã được giới thiệu trong 80
trước khi có bất kỳ tiêu chuẩn nào.
Trong trường hợp có hai giá trị, chúng là từ đồng nghĩa.
Tuy nhiên, chúng được triển khai khác nhau.
NVL
luôn đánh giá cả hai đối số, trong khi COALESCE
thường dừng đánh giá bất cứ khi nào nó tìm thấy không phải NULL
đầu tiên (có một số ngoại lệ, chẳng hạn như trình tự NEXTVAL
):
SELECT SUM(val)
FROM (
SELECT NVL(1, LENGTH(RAWTOHEX(SYS_GUID()))) AS val
FROM dual
CONNECT BY
level <= 10000
)
Điều này chạy gần như 0.5
giây, vì nó tạo SYS_GUID()
của, mặc dù 1
không phải là NULL
.
SELECT SUM(val)
FROM (
SELECT COALESCE(1, LENGTH(RAWTOHEX(SYS_GUID()))) AS val
FROM dual
CONNECT BY
level <= 10000
)
Điều này hiểu rằng 1
không phải là NULL
và không đánh giá đối số thứ hai.
SYS_GUID
không được tạo và truy vấn là tức thì.