Utiliser les fonctions scalaires

Effectué

Les fonctions scalaires retournent une valeur unique et travaillent généralement sur une seule ligne de données. Le nombre de valeurs d’entrée qu’elles prennent peut être égal à zéro (par exemple, GETDATE), un (par exemple, UPPER) ou plus (par exemple, ROUND). Étant donné que les fonctions scalaires renvoient toujours une seule valeur, elles peuvent être utilisées partout où une seule valeur (le résultat) est nécessaire. Elles sont le plus souvent utilisées dans les clauses SELECT et les prédicats de clause WHERE. Elles peuvent également être utilisées dans la clause SET d’une instruction UPDATE.

Les fonctions scalaires intégrées peuvent être organisées en nombreuses catégories : chaîne, conversion, logique, mathématiques, etc. Ce module va examiner quelques fonctions scalaires courantes.

Voici quelques points à prendre en compte lors de l’utilisation de fonctions scalaires :

  • Déterminisme : si la fonction retourne la même valeur pour les mêmes entrée et état de base de données chaque fois qu’elle est appelée, nous disons qu’elle est déterministe. Par exemple, ROUND(1.1, 0) retourne toujours la valeur 1.0. De nombreuses fonctions intégrées sont non déterministes. Par exemple, GETDATE() renvoie les date et heure actuelles. Les résultats des fonctions non déterministes ne peuvent pas être indexés, ce qui affecte la capacité du processeur de requêtes à trouver un bon plan d’exécution de la requête.
  • Classement : lors de l’utilisation de fonctions qui manipulent des données caractères, quel classement sera utilisé ? Certaines fonctions utilisent le classement (ordre de tri) de la valeur d’entrée ; d’autres utilisent le classement de la base de données si aucun classement d’entrée n’est fourni.

Exemples de fonctions scalaires

Au moment de la rédaction de ce document, la documentation technique de SQL Server répertorie plus de 200 fonctions scalaires qui couvrent plusieurs catégories, notamment :

  • Fonctions de configuration
  • Fonctions de conversion
  • Fonctions curseur
  • Fonctions de date et heure
  • Fonctions mathématiques
  • Fonctions de métadonnées
  • Fonctions de sécurité
  • Fonctions de chaînes
  • Fonctions système
  • Fonctions de statistiques système
  • Fonctions texte et image

Nous n’avons pas assez de temps dans ce cours pour décrire chaque fonction, mais les exemples ci-dessous illustrent des fonctions couramment utilisées.

L’exemple hypothétique suivant utilise plusieurs fonctions de date et d’heure :

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;

Les résultats partiels sont affichés ci-dessous :

SalesOrderID

OrderDate

OrderYear

OrderMonth

OrderDay

OrderWeekDay

YearsSinceOrder

71774

2008-06-01T00:00:00

2008

June

1

Dimanche

13

...

...

...

...

...

...

...

L’exemple suivant comprend certaines fonctions mathématiques :

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;

Résultats partiels :

TaxAmt

Arrondi

Floor

Ceiling

Squared

Root

Journal

Aléatoire

70.4279

70.0000

70.0000

71.0000

4960.089098

8.392133221

4.254589491

28.64120429

...

..

...

...

...

...

...

...

L’exemple suivant utilise des fonctions de chaîne :

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;

Résultats partiels :

CompanyName

UpperCase

LowerCase

Longueur

Inversé

FirstSpace

FirstWord

RestOfName

A Bike Store

A BIKE STORE

a bike store

12

erotS ekiB A

2

Un

Bike Store

Progressive Sports

PROGRESSIVE SPORTS

progressive sports

18

stropS evissergorP

12

Progressif

Sports

Advanced Bike Components

ADVANCED BIKE COMPONENTS

advanced bike components

24

stnenopmoC ekiB decnavdA

9

Avancé

Bike Components

...

...

...

...

...

...

...

...

Fonctions logiques

Une autre catégorie de fonctions permet de déterminer laquelle, parmi plusieurs valeurs, doit être retournée. Les fonctions logiques évaluent une expression d’entrée et retournent une valeur appropriée en fonction du résultat.

IIF

La fonction IIF évalue une expression d’entrée booléenne et retourne une valeur spécifiée si l’expression prend la valeur True et une autre valeur si l’expression prend la valeur False.

Par exemple, considérez la requête suivante, qui évalue le type d’adresse d’un client. Si la valeur est « Main Office », l’expression retourne « Billing ». Pour toutes les autres valeurs de type d’adresse, l’expression retourne « Mailing ».

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

Les résultats partiels de cette requête peuvent ressembler à ceci :

Typedadresse

UseAddressFor

Main Office

Facturation

Expédition

Mailing

...

...

CHOOSE

La fonction CHOOSE évalue une expression entière et retourne la valeur correspondante d’une liste en fonction de sa position ordinale (de base 1).

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

Les résultats de cette requête peuvent se présenter comme suit :

SalesOrderID

Statut

OrderStatus

1234

3

Delivered (Livrée)

1235

2

Shipped

1236

2

Shipped

1237

1

Ordered (Validée)

...

...

...