Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Radzenie sobie z wartościami NULL w SQL Server

Co to jest NULL? NULL lub znacznik NULL to sposób, w jaki reprezentujemy nieznaną wartość w SQL, przez SQL mam na myśli standardowy Structured Query Language, a nie MS SQL Server. Ostatnie zdanie przenosi nas trochę wstecz do roku 1969, kiedy standard został po raz pierwszy zdefiniowany przez dr E.F. Codda. NULL staje się konieczne, ponieważ musimy myśleć w kategoriach tak zwanej trójwartościowej logiki predykatów. Predykat jest właściwością wyrażenia, które albo przechowuje, albo nie. Na pierwszy rzut oka można by pomyśleć o dwóch możliwościach:PRAWDA lub FAŁSZ. Istnieje jednak trzecia możliwość:NIEZNANE.

Weźmy przykład. Zakładając atrybut (kolumnę) w naszej relacji (Tabela) reprezentuje numer identyfikacji podatkowej (TIN) zbioru właścicieli małych firm w Akrze w Ghanie. Kolumna dla rekordu każdego właściciela firmy zostanie wypełniona jego NIP i możemy użyć tej kolumny do określenia innych atrybutów, na przykład, czy jest na bieżąco w płatnościach podatkowych. Istnieją jednak dwie dodatkowe możliwości w tym przypadku użycia:

  1. Właściciel firmy ma numer TIN i jest aktualny.
  2. Właściciel firmy nie ma numeru TIN i jest (oczywiście) nieaktualny.

Powyższe opisuje to, co dr Codd nazwał czterowartościową logiką predykatów. Jednak standard SQL upraszcza te dwa dodatkowe warunki, definiując je jako nieznane, czyli NULL. Nie znamy numeru TIN właściciela firmy i nie możemy określić żadnej innej wartości na podstawie atrybutu właściciela firmy, którego to dotyczy. Tak więc NULL jest NIEZNANE i jest trzecią wartością w standardowej trójwartościowej logice predykatów.

NULL jest specjalne

Definicja NULL wymusza traktowanie znacznika w inny sposób niż wartości rzeczywiste. Oto przykłady:

  1. Nie ma czegoś takiego jak filtr „WHERE =NULL;”. Prawidłowe wyrażenie to „WHERE IS NULL;”. To samo dotyczy wyrażenia odwrotnego.
  2. Podczas sortowania w porządku rosnącym SQL można wybrać, czy wartości NULL mają być wyświetlane na początku czy na końcu. Domyślnym ustawieniem jest najpierw wylistowanie wartości NULL.
  3. Nie można porównywać wartości NULL. Powinno to być oczywiste, ponieważ powiedzieliśmy, że NULL jest NIEZNANE.
  4. Kiedy próba konkatenacji obejmuje kolumnę NULL, wynikiem jest NULL.

Typowe funkcje związane z wartością NULL

Poniżej znajdują się trzy popularne funkcje związane z wartością NULL w SQL Server

ISNULL

ISNULL — zastępuje NULL określoną wartością zastępczą. Listing 1 i Rysunek 1 pokazują proste przykłady ISNULL.

-- Listing 1:Prosty przykład ISSNULLSELECT ISNULL (NULL, 3) NULLREPLACEMENT;SELECT ISNULL (NULL,'GREEN') NULLREPLACEMENT;SELECT ISNULL (NULL,'2018-12-25') NULLREPLACEMENT;

Rys 1:Prosty przykład ISNULL

NULLIF

NULLIF zwraca NULL to wartość dwóch argumentów jest równa.

-- Listing 2:Prosty przykład NULLIFSELECT NULLIF(3,3) AS NULLIFF;SELECT NULLIF(3,5) AS NULLIFF;SELECT NULLIF('RED','RED') AS NULLIFF;SELECT NULLIF('GREEN „,„CZERWONY”) JAKO NULLIFF;

Rys. 2:Prosty przykład NULLIF

POŁĄCZENIE

COALESCE zwraca pierwszą niezerową wartość z podanej listy. Listing 1 pokazuje przykłady tego, a Rys 1 pokazuje wyniki zapytań.

-- Listing 3:Prosty przykład COALESCESELECT COALESCE (NULL,'','GREEN'','','') AS NULLRESPONSE;SELECT COALESCE (NULL,'GREEN','HOPE','') AS NULLRESPONSE;SELECT COALESCE (1,'','GREEN','','') AS NULLRESPONSE;

Rys 3:Prosty przykład łączenia

Zauważ, że te proste przykłady ujawniają użycie natury NULL. NULL i spacja to NIE to samo. W pierwszej instrukcji COALESCE zwraca spację, pokazując nam, że spacja jest pierwszą wartością inną niż NULL na liście.

Różnice między ISNULL a COALESCE

Różnice między ISNULL i COALESCE były tematem kilku artykułów online, a także książek, takich jak te wymienione w sekcji referencji. Różnice te można podsumować w następujący sposób:

  1. ISNULL jest własnością SQL Server, podczas gdy COALESCE jest standardową funkcją ANSI. Oznacza to, że ze względu na przenośność preferowana jest opcja COALESCE.
  2. ISNULL przyjmuje tylko dwa argumenty, podczas gdy COALESCE może przyjmować więcej niż dwa argumenty.
  3. Typ danych wartości zwracanej przez ISNULL jest określany przez typ danych pierwszego argumentu, podczas gdy typ danych wartości zwracanej przez COALESCE jest określany przez typ danych na liście o najwyższym priorytecie.
  4. Gdy obie funkcje są używane z podzapytaniami, ISNULL działa lepiej, ponieważ COALESCE jest wewnętrznie tłumaczone na wyrażenie CASE, co powoduje, że ma tendencję do powtarzania skanów.

Itzik Ben-Gan bada również inne konsekwencje konwersji COALESCE na wyrażenie przypadku w swoim artykule, do którego link znajduje się na końcu tego artykułu.

Przykłady użycia

Chcemy wyświetlić na portalu internetowym listę klientów na podstawie określonych kryteriów z tabeli, którą tworzymy na Listingu 4. Zadania 1 i 2 podają możliwe wymagania i używamy ISNULL i COALESCE, aby spełnić wymagania.

--Listing 4:Skrypt tworzenia tabeliCREATE TABLE CUSTOMER (ID INT IDENTITY (1,1),FIRSTNAME VARCHAR(50),LASTNAME VARCHAR(50),SEX CHAR(1),ADDRESS VARCHAR(300),FIRSTTRANDATE DATETIME, NUMER TELEFONU1 BIGINT,NUMER TELEFONU2 BIGINT,NUMER TELEFONU3 BIGINT);WSTAW W WARTOŚCI KLIENTA („KENNETH”, „IGIRI”, „M”, „ACCRA, GHANA”, GETDATE(), „0245335678”, „0555335678”, NULL); WARTOŚCI DLA KLIENTA („RICHARD”, „HANO”, „M”, „BUDAPESZT, WĘGRY”, GETDATE(), „889189400122”, NULL, NULL); WSTAWIĆ WARTOŚCI DLA KLIENTA („GRUZJA”, „APPIAH”, „F” ,'AKRA, GHANA','16.09.2018','02456665678','0275339678',NULL);WSTAW W WARTOŚCI KLIENTA ('HOWARD','KLEVIA',NULL,'HAGA, SZWAJCARIA','02- 16-2017','3499285782',NULL,NULL);WSTAW W WARTOŚCI KLIENTA ('ZEN','GREGOR',NULL,'SZANGHAJ, CHINY','06-23-2018','0245335678','0555335678' ,NULL);WSTAW WARTOŚCI KLIENTA ('IHEOMA','AWA','F','LAGOS, NIGERIA',GETDATE(),'0245335678','0555335678',NULL);

Rys. 4 Przykładowa tabela

Zadanie 1 :zwróć listę wszystkich klientów, którzy nie podali alternatywnego numeru telefonu.

--Listing 5:Tabela Lista klientów bez dodatkowych telefonów--A:Prosta odpowiedźSELECT * FROM CUSTOMER GDZIE NUMER TELEFONU2 JEST NULL;--B:Prezentacja zbioru wyników BetterSELECT IMIĘ, NAZWISKO, ADRES, PIERWSZY NUMER TELEFONU 1 JAKO [GŁÓWNY NUMER TELEFONU],ISNULL(CAST(PHONENUMBER2 AS VARCHAR), 'BRAK DODATKOWEGO TELEFONU') JAKO [DODATKOWY NUMER TELEFONU] OD KLIENTA, GDZIE PHONENUMBER2 JEST NULL;

Używając COALESCE (lub ISNULL), możemy znacznie lepiej przedstawić wymagane informacje, używając tekstu, który mówi „Brak drugiego telefonu”.

Rys. 5 Zestaw wyników dla Listu 5

Zadanie 2 :zwróć listę wszystkich klientów, ich główny numer telefonu, i dowolny inny alternatywny numer telefonu.

--Listing 6:Tabela Lista klientów z innym alternatywnym numerem SELECT IMIE,NAZWISKO,ADRES,PIERWSZA RANDA,NUMER TELEFONU1 AS [PODSTAWOWY NUMER TELEFONU],COALESCE(CAST(NUMER TELEFONU2 AS VARCHAR),CAST(NUMER TELEFONU3 JAKO VARCHAR), ' NIE MA INNEGO TELEFONU”) JAKO [INNY NUMER TELEFONU]OD KLIENTA;

Rys. 6 Zestaw wyników dla Listingu 6

W tym przypadku ISNULL nie jest opcją, ponieważ przekazujemy trzy argumenty.

Wniosek

W tym artykule omówiliśmy koncepcję NULL w odniesieniu do trójwartościowej logiki predykatów i opisaliśmy popularne funkcje, których używamy w SQL Server do obsługi zestawów danych zawierających wartości NULL. Widzieliśmy również przykłady wykorzystania tych funkcji. Wiele innych odniesień zagłębia się w zastosowanie, korzyści i ograniczenia tych funkcji. Gorąco polecam książki i blogi Itzika Ben-Gana jako dobre źródło informacji.

Referencje

  • NULLIF (Transact-SQL)
  • POŁĄCZENIE (Transact-SQL)
  • Artykuł Itzika Ben-Gana

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. zapytanie sql, aby zwrócić różnice między dwiema tabelami

  2. Przekroczono limit czasu zapytania z aplikacji internetowej, ale działa dobrze w studiu zarządzania

  3. Przestawiaj wiele kolumn na podstawie jednej kolumny w SQL Server

  4. Wskaźniki wydajności serwera SQL pozwalające wyprzedzić konkurencję

  5. Jak wstawiać wiersze do tabeli SQL Server za pomocą interfejsu graficznego Edit Table Rows — SQL Server / TSQL Tutorial, część 101