02.06.2014, Vladimír Klaus, navštíveno 3792x

MS Access
SQL

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)

Funkce SGN 1

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)

Funkce SGN 2

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

Funkce SGN 3

Případně zda je vyplněná nějaká textová položka.

SELECT Prijmeni, SGN(LEN(Telefon)) AS Vyplneno FROM Zakaznici

Funkce SGN 4

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

Funkce SGN 5

V jiných databázích

Místo funkce SGN se může používat SIGN.