Myślisz o wyrażeniu CASE
jakby brał null
jako wejście do funkcji lub operatora, gdzie null wejście na ogół skutkuje zerowym wyjścia:
regress=> SELECT 't'::boolean = NULL::boolean;
bool
------
(1 row)
wheras zachowuje się jak klauzula WHERE
pod względem obsługi zerowej:
craig=> SELECT 't' WHERE NULL;
?column?
----------
(0 rows)
W klauzulach WHERE
- oraz w CASE
, wynik NULL
z wyrażenia testowego jest traktowany jako "nieprawdziwy, a zatem fałszywy". W pewnym sensie godne ubolewania jest to, że standard SQL nie spowodował wyrażenia NULL
w wyrażeniu WHERE
jako błędu zamiast traktowania go jako fałszywego, ale tak właśnie jest.
To kolejny bolesny objaw NULL
„s rozdwojenie jaźni, gdzie spec SQL nie może zdecydować, czy NULL
oznacza«Nieznany/wartość nieokreśloną»lub«braku wartości», podobnie jak okropny bałagan z NULL
s i agregaty.
Więc to tylko ze względu na specyfikację SQL? Deweloperzy PostgreSQL po prostu poszli za tym, zamiast robić "dobrą rzecz" _? Podejrzewałem, że tak było. –
@ClodoaldoNeto Tak, i to jest prawie taka polityka, w której konflikt interesów dotyczy speca i zdrowego świata. W tym przypadku myślę, że jest to całkiem rozsądne; 'CASE' nie jest funkcją, jest specjalnym wyrażeniem z własnymi regułami. Funkcje i tak mogą mieć specjalne wartości zerowe; świadek 'dekodowania 'Oracle. PostgreSQL nie może tego naprawić bez przepisania specyfikacji SQL, aby całkowicie wyeliminować zamieszanie związane z wartościami zerowymi, co powoduje, że jest całkowicie niezgodny ze wszystkim innym. –