Scalaire functies gebruiken

Voltooid

Scalaire functies retourneren één waarde en werken meestal aan één rij gegevens. Het aantal invoerwaarden dat ze nemen, kan nul zijn (bijvoorbeeld GETDATE), één (bijvoorbeeld UPPER) of meerdere (bijvoorbeeld AFRONDEN). Omdat scalaire functies altijd één waarde retourneren, kunnen ze overal worden gebruikt waar één waarde (het resultaat) nodig is. Ze worden meestal gebruikt in SELECT-componenten en WHERE-componentpredicaten. Ze kunnen ook worden gebruikt in de SET-component van een UPDATE-instructie.

Ingebouwde scalaire functies kunnen worden ingedeeld in veel categorieën, zoals tekenreeks, conversie, logisch, wiskundig en andere. In deze module worden enkele algemene scalaire functies besproken.

Enkele overwegingen bij het gebruik van scalaire functies zijn:

  • Determinisme: Als de functie dezelfde waarde retourneert voor dezelfde invoer- en databasestatus telkens wanneer deze wordt aangeroepen, zeggen we dat deze deterministisch is. Round(1.1, 0) retourneert bijvoorbeeld altijd de waarde 1,0. Veel ingebouwde functies zijn niet-deterministisch. MET GETDATE() wordt bijvoorbeeld de huidige datum en tijd geretourneerd. Resultaten van niet-deterministische functies kunnen niet worden geïndexeerd, wat van invloed is op de mogelijkheid van de queryprocessor om een goed plan te bedenken voor het uitvoeren van de query.
  • Sortering: Wanneer u functies gebruikt waarmee tekengegevens worden bewerkt, welke sortering wordt gebruikt? Sommige functies gebruiken de sortering (sorteervolgorde) van de invoerwaarde; andere gebruiken de sortering van de database als er geen invoersortering wordt opgegeven.

Voorbeelden van scalaire functies

Op het moment van schrijven bevat de technische documentatie van SQL Server meer dan 200 scalaire functies die meerdere categorieën omvatten, waaronder:

  • Configuratiefuncties
  • Conversiefuncties
  • Cursorfuncties
  • De functies Date en Time
  • Wiskundige functies
  • Metagegevensfuncties
  • Beveiligingsfuncties
  • Tekenreeksfuncties
  • Systeemfuncties
  • Statistische functies van het systeem
  • Tekst- en afbeeldingsfuncties

Er is onvoldoende tijd in deze cursus om elke functie te beschrijven, maar in de onderstaande voorbeelden ziet u enkele veelgebruikte functies.

In het volgende hypothetische voorbeeld worden verschillende datum- en tijdfuncties gebruikt:

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;

Gedeeltelijke resultaten worden hieronder weergegeven:

VerkooporderID

Besteldatum

Besteljaar

OrderMaand

Besteldag

OrderWeekDay

JarenSindsBestelling

71774

2008-06-01T00:00:00

2008

Juni

1

Zondag

13

...

...

...

...

...

...

...

Het volgende voorbeeld bevat enkele wiskundige functies:

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;

Gedeeltelijke resultaten:

TaxAmt

Afgeronde

Etage

Plafond

Kwadraat

Hoofdniveau

Logboek

Gerandomiseerde

70.4279

70.0000

70.0000

71.0000

4960.089098

8.392133221

4.254589491

28.64120429

...

..

...

...

...

...

...

...

In het volgende voorbeeld worden enkele tekenreeksfuncties gebruikt:

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;

Gedeeltelijke resultaten:

Bedrijfsnaam

Hoofdletters

Onderkast

Lengte

Omgekeerd

FirstSpace

EersteWoord

RestOfName

Een fietswinkel

EEN FIETSWINKEL

een fietswinkel

12

erotS ekiB A

2

Een

Fietswinkel

Progressieve sporten

PROGRESSIEVE SPORTEN

progressieve sporten

18

stropS evissergorP

12

Progressief

Sport

Geavanceerde fietsonderdelen

GEAVANCEERDE FIETSONDERDELEN

geavanceerde fietsonderdelen

24

stnenopmoC ekiB decnavdA

9

Geavanceerd

Fietsonderdelen

...

...

...

...

...

...

...

...

Logische functies

Met een andere functiecategorie kunt u bepalen welke van de verschillende waarden moet worden geretourneerd. Logische functies evalueren een invoerexpressie en retourneren een geschikte waarde op basis van het resultaat.

IIF

De functie IIF evalueert een Booleaanse invoerexpressie en retourneert een opgegeven waarde als de expressie Waar oplevert en een alternatieve waarde als de expressie onwaar oplevert.

Denk bijvoorbeeld aan de volgende query, waarmee het adrestype van een klant wordt geëvalueerd. Als de waarde 'Hoofdkantoor' is, retourneert de expressie 'Facturering'. Voor alle andere adrestypewaarden retourneert de expressie Mailing.

SELECT AddressType,
      IIF(AddressType = 'Main Office', 'Billing', 'Mailing') AS UseAddressFor
FROM Sales.CustomerAddress;

De gedeeltelijke resultaten van deze query kunnen er als volgt uitzien:

AdresType

GebruikAdresVoor

Hoofdkantoor

Facturatie

Verzenden

Mailing

...

...

KIEZEN

De functie CHOOSE evalueert een geheel getalexpressie en retourneert de bijbehorende waarde uit een lijst op basis van de rangschikking (1).

SELECT SalesOrderID, Status,
CHOOSE(Status, 'Ordered', 'Shipped', 'Delivered') AS OrderStatus
FROM Sales.SalesOrderHeader;

De resultaten van deze query kunnen er ongeveer als volgt uitzien:

VerkooporderID

Toestand

Bestelstatus

1234

3

Afgeleverd

1235

2

Verzonden

1236

2

Verzonden

1237

1

Besteld

...

...

...