Použití skalárních funkcí
Skalární funkce vracejí jednu hodnotu a obvykle pracují na jednom řádku dat. Počet vstupních hodnot, které berou, může být nula (například GETDATE), jedna (například VELKÁ) nebo násobek (například ZAOKROUHLIT). Vzhledem k tomu, že skalární funkce vždy vracejí jednu hodnotu, je možné je použít kdekoli, kde je potřeba jedna hodnota (výsledek). Nejčastěji se používají v klauzulích SELECT a predikátech klauzule WHERE. Lze je také použít v klauzuli SET příkazu UPDATE.
Předdefinované skalární funkce je možné uspořádat do mnoha kategorií, jako je řetězec, převod, logický, matematický a další. Tento modul se podívá na několik běžných skalárních funkcí.
Mezi důležité informace při použití skalárních funkcí patří:
- Determinismus: Pokud funkce vrátí stejnou hodnotu pro stejný vstupní stav a stav databáze při každém zavolání, říkáme, že je deterministický. Například funkce ROUND(1,1; 0) vždy vrátí hodnotu 1,0. Mnoho předdefinovaných funkcí je nedeterministické. Například funkce GETDATE() vrátí aktuální datum a čas. Výsledky nedeterministických funkcí nelze indexovat, což má vliv na schopnost procesoru dotazů přijít s dobrým plánem pro spuštění dotazu.
- Kolace: Používáte-li funkce, které manipulují s daty znaků, kterou kolaci použijete? Některé funkce používají kolaci (pořadí řazení) vstupní hodnoty; jiné používají kolaci databáze, pokud není zadána žádná vstupní kolace.
Příklady skalárních funkcí
V době psaní tohoto článku uvádí technická dokumentace k SQL Serveru více než 200 skalárních funkcí, které zahrnují více kategorií, včetně:
- Konfigurační funkce
- Převodní funkce
- Funkce kurzoru
- Funkce Date a Time
- Matematické funkce
- Funkce metadat
- Funkce zabezpečení
- Funkce řetězců
- Systémové funkce
- Statistické funkce systému
- Funkce textu a obrázku
V tomto kurzu není dostatek času k popisu jednotlivých funkcí, ale níže uvedené příklady ukazují některé běžně používané funkce.
Následující hypotetický příklad používá několik funkcí data a času:
SELECT SalesOrderID,
OrderDate,
YEAR(OrderDate) AS OrderYear,
DATENAME(mm, OrderDate) AS OrderMonth,
DAY(OrderDate) AS OrderDay,
DATENAME(dw, OrderDate) AS OrderWeekDay,
DATEDIFF(yy,OrderDate, GETDATE()) AS YearsSinceOrder
FROM Sales.SalesOrderHeader;
Částečné výsledky jsou uvedené níže:
SalesOrderID
OrderDate
OrderYear
OrderMonth
OrderDay
OrderWeekDay
YearsSinceOrder
71774
2008-06-01T00:00:00
2008
Červen
0
Neděle
13
...
...
...
...
...
...
...
Další příklad obsahuje některé matematické funkce:
SELECT TaxAmt,
ROUND(TaxAmt, 0) AS Rounded,
FLOOR(TaxAmt) AS Floor,
CEILING(TaxAmt) AS Ceiling,
SQUARE(TaxAmt) AS Squared,
SQRT(TaxAmt) AS Root,
LOG(TaxAmt) AS Log,
TaxAmt * RAND() AS Randomized
FROM Sales.SalesOrderHeader;
Částečné výsledky:
TaxAmt
Zaokrouhlený
Podlaží
Horní mez
Čtvercový
Root
Protokol
Náhodně rozdělil
70.4279
70.0000
70.0000
71.0000
4960.089098
8.392133221
4.254589491
28.64120429
...
..
...
...
...
...
...
...
Následující příklad používá některé řetězcové funkce:
SELECT CompanyName,
UPPER(CompanyName) AS UpperCase,
LOWER(CompanyName) AS LowerCase,
LEN(CompanyName) AS Length,
REVERSE(CompanyName) AS Reversed,
CHARINDEX(' ', CompanyName) AS FirstSpace,
LEFT(CompanyName, CHARINDEX(' ', CompanyName)) AS FirstWord,
SUBSTRING(CompanyName, CHARINDEX(' ', CompanyName) + 1, LEN(CompanyName)) AS RestOfName
FROM Sales.Customer;
Částečné výsledky:
CompanyName
Napsaný velkými písmeny
Malými písmeny
Délka
Reversed
FirstSpace
FirstWord
RestOfName
Obchod s koly
OBCHOD S KOLY
obchod s koly
12
erotS ekiB A
2
A
Bike Store
Progresivní sporty
PROGRESIVNÍ SPORTY
progresivní sporty
18
stropS evissergorP
12
Pokrokový
Sporty
Pokročilé komponenty pro kola
POKROČILÉ KOMPONENTY PRO KOLO
pokročilé součásti pro kola
24
stnenopmoC ekiB decnavdA
9
Rozšířený
Součásti pro kolo
...
...
...
...
...
...
...
...
Logické funkce
Další kategorie funkcí umožňuje určit, které z několika hodnot se má vrátit. Logické funkce vyhodnotí vstupní výraz a vrátí odpovídající hodnotu na základě výsledku.
IIF
Funkce IIF vyhodnotí logický vstupní výraz a vrátí zadanou hodnotu, pokud se výraz vyhodnotí jako True, a alternativní hodnotu, pokud se výraz vyhodnotí jako False.
Představte si například následující dotaz, který vyhodnocuje typ adresy zákazníka. Pokud je hodnota "Main Office", výraz vrátí "Billing". Pro všechny ostatní hodnoty typu adresy výraz vrátí "Korespondence".
SELECT AddressType,
IIF(AddressType = 'Main Office', 'Billing', 'Mailing') AS UseAddressFor
FROM Sales.CustomerAddress;
Částečné výsledky tohoto dotazu můžou vypadat takto:
AddressType
UseAddressFor
Ústředí
Fakturace
Lodní doprava
Poštovní zásilka
...
...
ZVOLIT
Funkce CHOOSE vyhodnotí celočíselné výrazy a vrátí odpovídající hodnotu ze seznamu na základě jeho (1) řadové pozice.
SELECT SalesOrderID, Status,
CHOOSE(Status, 'Ordered', 'Shipped', 'Delivered') AS OrderStatus
FROM Sales.SalesOrderHeader;
Výsledky z tohoto dotazu můžou vypadat nějak takto:
SalesOrderID
Stav
OrderStatus
1 234
3
Doručení
1235
2
Dopraveno
1236
2
Dopraveno
1237
0
Objednáno
...
...
...