02.06.2014, Vladimír Klaus, navštíveno 3818x
Funkce vrací znaménko předaného čísla. Pro záporná čísla vrátí -1, pro kladná 1, pro nulu 0 a případně pro NULL vrátí také NULL. K čemu je funkce dobrá si ukážeme na malém příkladu, i když je zřejmé, že stejného výsledku by se dalo dosáhnout i jinak (funkce SWITCH(), CHOOSE() apod.)
Základní úloha zní – kolik máme objednávek, které jsou za méně než 2000 a kolik za více než 2000. Pomůžeme si tím, že od částky odečteme 2000. Z toho nám vznikne kladné nebo záporné číslo, které pak předhodíme funkci SGN(). Pak už stačí jen přidat seskupení podle stejného údaje a samozřejmě také spočítání položek.
SELECT SGN(Castka-2000) AS Znamenko, COUNT(Znamenko) AS Pocet
FROM Objednavky
GROUP BY SGN(Castka-2000)
Poznámka: Všimněte si, že alias Pocet mohl být použit dále v SELECTu, ale už nemohl být použit při seskupování. Důvodem je to, že seskupování se vyhodnocuje dřív, než SELECT, a v té době tedy ještě žádný alias neexistoval. Více v části Pořadí vyhodnocení dotazu.
Počet objednávek, které jsou za méně než 2000, je 16, těch vyšších je 6. Ale co ten první řádek? V kolonce znaménko nic není, tedy je tam NULL. To znamená, že máme i nějaké objednávky, u kterých není vyplněná částka. Proč je ale pak v kolonce Počet uvedena nula? Protože hodnoty NULL se nedají spočítat.
Řešením je opět funkce NZ(), pomocí které převedeme NULL na nějakou pomocnou hodnotu (zde „X“), u které už bude možné zjistit počet výskytů.
SELECT NZ(SGN(Castka-2000), "X") AS Znamenko, COUNT(Znamenko) AS Pocet
FROM Objednavky
GROUP BY SGN(Castka-2000)
Nyní nám už počet sedí, protože zadaných objednávek je celkem 23. Z výsledků také vyplývá, že nemáme žádnou objednávku, která by byla přesně za 2000 korun.
Funkce se dá použít ale i třeba na zjištění, zda nějaká tabulka/dotaz obsahuje nějaké řádky (nezajímá nás kolik). V našem případě je tabulka Kontakty prázdná.
SELECT SGN(COUNT(*)) FROM Kontakty
Případně zda je vyplněná nějaká textová položka.
SELECT Prijmeni, SGN(LEN(Telefon)) AS Vyplneno FROM Zakaznici
Z obrázku je krásně vidět, že dva zákazníci měli vyplněný telefon, ale asi ho někdo smazal (položka je prázdná a délka je tak 0). Zatímco další 4 zákazníci telefon nikdy vyplněný neměli (položka je NULL).
Poslední příklad asi také spadá spíše do kategorie zajímavostí, ale i to se vám může někdy hodit. Předpokládejme, že máte v nějakém sloupci kladná i záporná čísla, ale vy tam potřebujete jen kladná. Ukážeme si to jen na prvních 10 záznamech. Dá se to napsat složitě přes SWITCH() třeba takto:
SELECT TOP 10 Castka-2000 AS PomCastka,
SWITCH (
PomCastka < 0, -1 * PomCastka,
PomCastka > 0, PomCastka) AS Kladne
FROM Objednavky
Mnohem elegantnější je pak tento zápis, když částku vynásobíme vlastním znaménkem.
SELECT TOP 10 Castka-2000 AS PomCastka,
PomCastka * SGN(PomCastka) AS Kladne
FROM Objednavky
V jiných databázích
Místo funkce SGN se může používat SIGN.