ISNULL

W tym wpisie pokażę bardzo przydatną funkcję ISNULL.

ZADANIE

Warunki początkowe: SQL Server, baza: AdventureWorks 2008 R2

Wyświetl 10 pierwszych wierszy z tabeli Person.Person i w miejscu gdzie dana osoba nie ma drugiego imienia wstaw pusty znak.

OBJAŚNIENIE

W celu pokazania zastosowania funkcji ISNULL napiszemy na początku zapytanie prezentujące wynik bez zastosowania ISNULL a później zastosujemy ww. funkcję.

ROZWIĄZANIE

Na początku napiszmy pytanie bez ISNULL’a

Polecenie ISNULL

W efekcie uruchomienia zapytanie otrzymamy wynik jak poniżej

Polecenie ISNULL

Od razu widać wartości NULL w drugiej kolumnie. Co oznacza NULL? Otóż NULL to dokładnie „brak wartości”. W celu „pozbycia” się wartości NULL w naszym wyniku zastosujemy funkcję ISNULL, która zachowuje się w ten sposób, że przy napotkaniu wartości NULL we wskazanej kolumnie zastępuje ją wartością którą jej wskażemy.

No to do dzieła. W naszym przykładnie zastąpimy wartość NULL pustym znakiem. Zapytanie poniżej.

ISNULL
ISNULL

W tym celu w „sekcji” SELECT przed [MiddleName] wstawiamy ISNULL i otwieramy nawias. Po [MiddleName] dajemy przecinek i po przecinku wstawiamy taką wartość jaką chcemy otrzymać, w naszym przypadku są to dwa apostrofy. W ten sposób jeśli w kolumnie [MiddleName] funkcja ISNULL napotka wartość NULL zamieni ją na to co jest pomiędzy apostrofami czyli u nas wstawi pusty ciąg. Wynik uruchomienia naszego zapytania poniżej.

ISNULL
ISNULL

 

SELECT

Komenda SELECT służy do określenia jakie dane chcemy otrzymać w wyniku naszego zapytania. Słowo to występuje (w przeważającej większości przypadków) na początku zapytania i możemy zadeklarować jakie dane chcemy otrzymać.

Jakiś prosty przykład na początek.

ZADANIE 1 (baza: AdventureWorks2008R2)

Wyświetl pierwsze 10 produktów (rekordów) z bazy AdventureWorks 2008 R2 z tabeli „produkty”, których nazwy zaczynają się na liter „T”.

ZAPYTANIE

polecenie SELECT
polecenie SELECT

OBJAŚNIENIE

Zapytanie jest dość proste. Jak widzimy na początku występuje polecenie SELECT. Ogólnie można powiedzieć, że w „sekcji” SELECT deklarujemy to co chcemy zobaczyć w „sekcji” FROM deklarujemy źródło danych (czyli skąd chcemy pobrać dane) i w „sekcji”  WHERE wpisujemy dodatkowe warunki dla naszych danych.

i tak dla naszego zapytania określiliśmy, że chcemy zobaczyć identyfikator produktu (ProductID), jego nazwę (Name) i numer produktu (ProductNumber).

Dodatkowymi warunkami było

– pierwsze 10 produktów które zaczynają się na literę „T”. Liczbę produktów określa kod ” TOP (10) ” a warunek aby produkt zaczynał się na literę „T” określa kod ” WHERE (Name like N’T%’) ”

WYNIK

polecenie SELECT
polecenie SELECT

Odejmowanie dwóch dat (obecna – data zdarzenia) i prezentacja wyników w dniach

PROBLEM:

Odejmowanie dwóch dat (obecna – data zdarzenia) i prezentacja wyników w dniach

SZCZEGÓŁY:

Chciałbym odjąć dwie daty, obecną – data zdarzenia (np. data zapisania rekordu do bazy), w celu prezentacji wyników odejmowania w dniach. Jeśli zdarzenie (np. data zapisania rekordu do bazy) mała miejsce dzisiaj to w wyniku zapytania chcę otrzymać tekst „dzisiaj” i analogicznie jeśli zdarzenie miało miejsce wczoraj to chcę otrzymać tekst ‚wczoraj’ i tak samo z ‚przedwczoraj’. Jeśli zdarzenie miało miejsce później niż przedwczoraj to wynikiem odejmowania ma być prezentacja daty zdarzenia w formacie „Y-m-d”, czyli Rok-miesiąc-dzień.

ROZWIĄZANIE:

Możemy ten problem rozwiązać na poziomie aplikacji czy strony WWW, pobrać datę z bazy i porównać ją daty obecnej. Pewniejszym rozwiązaniem będzie uzyskanie potrzebnego wyniku od razy z zapytania SQL. W tym celu możemy skorzystać z funkcji DATEDIFF, która zwróci nam różnicę między parametrami (w tym przypadku datami). Aby uzyskać zadowalający nas efekt musimy jeszcze skorzystać z funkcji CASE która w zależności od wyniku odejmowania dat zwróci nam wartość o którą nam chodzi (‚dzisiaj’, ‚wczoraj’, ‚przedwczoraj’ lub datę zapisu rekordu do bazy inną nić wymienione).

SELECT
id
,tytul
,opis
,cena
,case(datediff(now(),data_dodania))               <- tutaj następuje odjęcie dat

WHEN 0 THEN ‚dzisiaj’      <- jeśli zdarzenie miało miejsce dzisiaj to różnicą w odejmowaniu jest 0, wtedy chcemy wyświetlić tekst  ‚dzisiaj’

WHEN 1 THEN ‚wczoraj’  <- jeśli zdarzenie miało miejsce wczoraj to różnicą w odejmowaniu jest 1, wtedy chcemy wyświetlić tekst  ‚wczoraj’

WHEN 2 THEN ‚przedwczoraj’   <- analogicznie jak wyżej

ELSE date(data_dodania) END as data_dodania   <- wszystkie inne przypadki to sytuacje kiedy zdarzenie miało miejsce wcześniej niż przedwczoraj i wtedy chcemy wyświetlić konkretną datę w formacie „Y-m-d”
,data_dodania as data_dodania_org   <- jeśli oryginalna data jest w formacie DATETIME to możemy ją wykorzystać do sortowania
FROM
tab1
WHERE
[..TUTAJ PODAJEMY WARUNKI WYSZUKIWANIA REKORDÓW…]
ORDER BY
data_dodania_org DESC   <- jak już wcześniej pisałem możemy wykorzystać oryginalną datę do sortowania

GOTOWE 🙂 MIŁEJ ZABAWY