SQL IS NOT NULL

SQL IS NOT NULL



DEFINICJA

Polecenie IS NOT NULL jest związane z wartością NULL, czyli z wartością nieokreśloną (nieznaną). Jak sama nazwa sugeruje za pomocą IS NOT NULL możemy wyszukać wszystkie wartość które NIE są NULL-ami. Poniżej przykład filtrowania rekordów w tabeli za pomocą polecenia IS NOT NULL.


Przykład zastosowania IS NOT NULL (baza AdventureWorks)

Wyświetl pracowników (tabela Person.Person) którzy mają drugie imię.

SELECT
FirstName AS Imię
,MiddleName AS [Drugie imię]
,LastName AS Nazwisko
FROM
Person.Person
WHERE
MiddleName IS NOT NULL
AND (PersonType = ‚EM’ OR PersonType = ‚SP’)

Żeby uzyskać prawidłowy wynik w części WHERE musimy dodać warunek MiddleName IS NOT NULL, co można zinterpretować tak: pokaż mi wszystkie rekordy z pracownikami gdzie pole MiddleName NIE JEST PUSTE, czyli którzy pracownicy mają drugie imię.


Za pomocą IS NOT NULL możemy także filtrować wyniki zapytania do rekordów które w zdefiniowanym polu NIE mają wartości NULL, przykład poniżej.

Przykład zastosowania IS NOT NULL (baza AdventureWorks)

Wyświetl listę produktów które były, choć raz, użyte w zamówieniach (bo wiadomo, że nie każdy produkt z asortymentu musi być zamówiony).

Na początek żeby pokazać Wam jak wykorzystując wartości NULL możemy rozwiązać ten problem.

Połączmy dwie tabele Production.Product z tabelą Sales.SalesOrderDetails za pomocą polecenie LEFT JOIN. Jeżeli produkt nie znalazł się w żadnym z zamówień w ostatniej kolumnie wyniku zapytania pojawi nam się wartość NULL a jeśli wystąpił pojawi się ID tego produktu z zamówienia (ID z kolumn 1 i 4 powinny być takie same).

Zapytanie:

SELECT
P.ProductID
,P.Name
,P.ProductNumber
,D.ProductID
FROM
Production.Product P
LEFT JOIN Sales.SalesOrderDetail D ON P.ProductID = D.ProductID

Zrzut z częścią wyniku:

Żeby nie zaciemniać wyników wyświetliłem tylko cztery kolumny. W ostatniej wyświetliłem ID produktu z tabeli Sales.SalesOrderDetails. Jeżeli system nie znalazł dopasowania produtku do żadnego z zamówień to wyświetla NULL a jeżeli znalazł takie dopasowanie to wyświetlane jest ID produktu z zamówienia (oczywiście ID produktu z kolumny 1 i 4 powinny być takie same).

Jeżeli teraz chcemy wyświetlić tylko te produtkty, które znajdują się w zamówieniach musimy dodać warunek: pokaż produkty które w polu ProductID (z tabeli Sales.SalesOrderDetails) ma wartość inną niż NULL, czyli nasze zapytanie przybierze formę.

SELECT
P.ProductID
,P.Name
,P.ProductNumber
,D.ProductID
FROM
Production.Product P
LEFT JOIN Sales.SalesOrderDetail D ON P.ProductID = D.ProductID
WHERE
D.ProductID IS NOT NULL
GROUP BY
P.ProductID, P.Name, P.ProductNumber, D.ProductID