Problem polega na tym, że NULL nie jest uważany za równy niczego, nawet samemu sobie, ale dziwne jest to, że również nie jest równy sobie.
Rozważ następujące instrukcje (które są BTW nielegalne w SQL Server T-SQL, ale są prawidłowe w My-SQL, jednak to właśnie ANSI definiuje jako null, i można je zweryfikować nawet w SQL Server za pomocą instrukcji case itp.)
SELECT NULL = NULL -- Results in NULL
SELECT NULL <> NULL -- Results in NULL
Więc nie ma prawdziwej / fałszywej odpowiedzi na pytanie, zamiast tego odpowiedź jest również pusta.
Ma to wiele implikacji, na przykład w
- Sprawozdanie sprawy, w której każda wartość zerowa zawsze korzystają z klauzuli ELSE chyba użyć jawnie WHEN warunek IS NULL ( NIE warunek )
WHEN NULL
- Łączenie ciągów, jak
SELECT a + NULL -- Results in NULL
- W klauzulach WHERE IN lub WHERE NOT IN, jeśli chcesz poprawnych wyników, upewnij się w skorelowanym zapytaniu podrzędnym, aby odfiltrować wartości zerowe.
Można nadpisać to zachowanie w SQL Server, określając SET ANSI_NULLS OFF
, ale NIE jest to zalecane i nie należy tego robić, ponieważ może powodować wiele problemów, po prostu z powodu odchylenia standardu.
(Na marginesie, w My-SQL istnieje opcja użycia specjalnego operatora <=>
do porównania zerowego.)
Dla porównania, w ogólnych językach programowania null jest traktowany jako wartość regularna i jest sobie równy, jednak jest to wartość NAN, która również nie jest sobie równa, ale przynajmniej zwraca wartość „fałsz” podczas porównywania go z samym sobą (i podczas sprawdzania, czy nie jest równy, różne języki programowania mają różne implementacje).
Zauważ jednak, że w językach podstawowych (tj. VB itp.) Nie ma słowa kluczowego „null”, a zamiast tego używa się słowa kluczowego „Nic”, którego nie można użyć w bezpośrednim porównaniu, a zamiast tego należy użyć słowa „IS” jak w języku SQL, jednak w rzeczywistości jest on równy sobie (przy użyciu porównań pośrednich).