Brug skalarfunktioner
Skalarfunktioner returnerer en enkelt værdi og arbejder normalt på en enkelt række med data. Antallet af inputværdier, de tager, kan være nul (f.eks. GETDATE), én (f.eks. UPPER) eller flere (f.eks. ROUND). Da skalarfunktioner altid returnerer en enkelt værdi, kan de bruges overalt, hvor der kræves en enkelt værdi (resultatet). De bruges oftest i SELECT-delsætninger og WHERE-delsætnings prædikater. De kan også bruges i SET-delsætningen i en UPDATE-sætning.
Indbyggede skalarfunktioner kan organiseres i mange kategorier, f.eks streng, konvertering, logisk, matematisk m.m. I dette modul ser vi på nogle få almindelige skalarfunktioner.
Nogle overvejelser, når du bruger skalarfunktioner, omfatter:
- Determinisme: Hvis funktionen returnerer den samme værdi for den samme input- og databasetilstand, hver gang den kaldes, siger vi, at den er deterministisk. ROUND(1.1, 0) returnerer f.eks. altid værdien 1.0. Mange indbyggede funktioner er nondeterministiske. GETDATE() returnerer f.eks. den aktuelle dato og det aktuelle klokkeslæt. Resultater fra nondeterministiske funktioner kan ikke indekseres, hvilket påvirker forespørgselsbehandlerens mulighed for at komme med en god plan for udførelse af forespørgslen.
- Sortering: Hvilken sortering bruges, når der bruges funktioner, der manipulerer tegndata? Nogle funktioner bruger sorteringsrækkefølgen for inputværdien. andre bruger databasens sortering, hvis der ikke er angivet nogen inputsamling.
Eksempler på skalarfunktion
I skrivende stund anviste SQL Server Technical Documentation mere end 200 skalarfunktioner, der spænder over flere kategorier, herunder:
- Konfigurationsfunktioner
- Konverteringsfunktioner
- Markørfunktioner
- Funktionerne Dato og klokkeslæt
- Matematiske funktioner
- Metadatafunktioner
- Sikkerhedsfunktioner
- Strengfunktioner
- Systemfunktioner
- System statistiske funktioner
- Funktionerne Tekst og Billede
Der er ikke tid nok i dette kursus til at beskrive hver funktion, men nedenstående eksempler viser nogle ofte anvendte funktioner.
I følgende hypotetiske eksempel bruges flere funktioner for dato og klokkeslæt:
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;
Der vises delvise resultater nedenfor:
SalesOrderID
Ordredato
Ordreår
OrderMonth
OrderDay
OrderWeekDay
YearsSinceOrder
71774
2008-06-01T00:00:00
2008
Juni
1
Søndag
13
...
...
...
...
...
...
...
Det næste eksempel indeholder nogle matematiske funktioner:
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;
Delvise resultater:
TaxAmt
Afrundet
Etage
Loft
Firkant
Rod
Log
Randomiseret
70.4279
70.0000
70.0000
71.0000
4960.089098
8.392133221
4.254589491
28.64120429
...
..
...
...
...
...
...
...
I følgende eksempel bruges nogle strengfunktioner:
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;
Delvise resultater:
Firmanavn
Store
Små
Længde
Vendt
FirstSpace
FirstWord
RestOfName
En cykelbutik
EN CYKELBUTIK
en cykelbutik
12
erotS ekiB A
2
En
Cykelbutik
Progressiv sport
PROGRESSIVE SPORTSGRENE
progressive sportsgrene
18
stropS evissergorP
12
Progressiv
Sport
Avancerede cykelkomponenter
AVANCEREDE CYKELKOMPONENTER
avancerede cykelkomponenter
24
stnenopmoC ekiB decnavdA
9
Avanceret
Cykelkomponenter
...
...
...
...
...
...
...
...
Logiske funktioner
En anden kategori af funktioner gør det muligt at bestemme, hvilken af flere værdier der skal returneres. Logiske funktioner evaluerer et inputudtryk og returnerer en passende værdi baseret på resultatet.
IIF
Funktionen IIF evaluerer et boolesk inputudtryk og returnerer en angivet værdi, hvis udtrykket evalueres til Sand, og en alternativ værdi, hvis udtrykket evalueres til Falsk.
Overvej f.eks. følgende forespørgsel, som evaluerer adressetypen for en kunde. Hvis værdien er "Hovedkontor", returnerer udtrykket "Fakturering". For alle andre værdier af adressetypen returnerer udtrykket "Mailing".
SELECT AddressType,
IIF(AddressType = 'Main Office', 'Billing', 'Mailing') AS UseAddressFor
FROM Sales.CustomerAddress;
De delvise resultater fra denne forespørgsel kan se sådan ud:
AddressType
UseAddressFor
Hovedkontor
Fakturering
Forsendelse
Mailing
...
...
VÆLGE
Funktionen CHOOSE evaluerer et heltalsudtryk og returnerer den tilsvarende værdi fra en liste baseret på dens (1-baserede) ordenstalsplacering.
SELECT SalesOrderID, Status,
CHOOSE(Status, 'Ordered', 'Shipped', 'Delivered') AS OrderStatus
FROM Sales.SalesOrderHeader;
Resultaterne fra denne forespørgsel kan se nogenlunde sådan ud:
SalesOrderID
Status
OrderStatus
1234
3
Leveret
1235
2
Leveret
1236
2
Leveret
1237
1
Bestilt
...
...
...