Recherche…
Introduction
L'expression CASE est utilisée pour implémenter la logique if-then.
Syntaxe
- CASE input_expression
QUAND comparer1 ALORS le résultat1
[QUAND compare2 THEN result2] ...
[AUTRE résultatX]
FIN - CAS
QUAND condition1 THEN result1
[QUAND condition2 THEN result2] ...
[AUTRE résultatX]
FIN
Remarques
L' expression CASE simple renvoie le premier résultat dont la valeur compareX
est égale à l' expression input_expression
.
L' expression CASE recherchée renvoie le premier résultat dont conditionX
est true.
CASE recherché dans SELECT (correspond à une expression booléenne)
Le CASE recherché renvoie des résultats lorsqu'une expression booléenne est TRUE.
(Cela diffère du cas simple, qui ne peut que vérifier l'équivalence avec une entrée.)
SELECT Id, ItemId, Price,
CASE WHEN Price < 10 THEN 'CHEAP'
WHEN Price < 20 THEN 'AFFORDABLE'
ELSE 'EXPENSIVE'
END AS PriceRating
FROM ItemSales
Id | ID de l'article | Prix | Prix |
---|---|---|---|
1 | 100 | 34,5 | COÛTEUX |
2 | 145 | 2.3 | PAS CHER |
3 | 100 | 34,5 | COÛTEUX |
4 | 100 | 34,5 | COÛTEUX |
5 | 145 | dix | ABORDABLE |
Utilisez CASE to COUNT le nombre de lignes dans une colonne correspondent à une condition.
Cas d'utilisation
CASE
peut être utilisé conjointement avec SUM
pour renvoyer uniquement le nombre d'éléments correspondant à une condition prédéfinie. (Ceci est similaire à COUNTIF
dans Excel.)
L'astuce consiste à renvoyer des résultats binaires indiquant les correspondances, ainsi les "1" renvoyés pour les entrées correspondantes peuvent être additionnés pour un compte du nombre total de correspondances.
Compte tenu de cette table ItemSales
, supposons que vous souhaitiez connaître le nombre total d'éléments classés comme "chers":
Id | ID de l'article | Prix | Prix |
---|---|---|---|
1 | 100 | 34,5 | COÛTEUX |
2 | 145 | 2.3 | PAS CHER |
3 | 100 | 34,5 | COÛTEUX |
4 | 100 | 34,5 | COÛTEUX |
5 | 145 | dix | ABORDABLE |
Question
SELECT
COUNT(Id) AS ItemsCount,
SUM ( CASE
WHEN PriceRating = 'Expensive' THEN 1
ELSE 0
END
) AS ExpensiveItemsCount
FROM ItemSales
Résultats:
ItemsCount | ExpensiveItemsCount |
---|---|
5 | 3 |
Alternative:
SELECT
COUNT(Id) as ItemsCount,
SUM (
CASE PriceRating
WHEN 'Expensive' THEN 1
ELSE 0
END
) AS ExpensiveItemsCount
FROM ItemSales
Shorthand CASE dans SELECT
La variante abrégée de CASE
évalue une expression (généralement une colonne) par rapport à une série de valeurs. Cette variante est un peu plus courte et évite la répétition répétée de l'expression évaluée. La clause ELSE
peut toujours être utilisée, bien que:
SELECT Id, ItemId, Price,
CASE Price WHEN 5 THEN 'CHEAP'
WHEN 15 THEN 'AFFORDABLE'
ELSE 'EXPENSIVE'
END as PriceRating
FROM ItemSales
Un mot d'avertissement. Il est important de réaliser que lors de l'utilisation de la variante courte, l'intégralité de l'instruction est évaluée à chaque WHEN
. Par conséquent, la déclaration suivante:
SELECT
CASE ABS(CHECKSUM(NEWID())) % 4
WHEN 0 THEN 'Dr'
WHEN 1 THEN 'Master'
WHEN 2 THEN 'Mr'
WHEN 3 THEN 'Mrs'
END
peut produire un résultat NULL
. C'est parce qu'à chaque WHEN
NEWID()
est appelée à nouveau avec un nouveau résultat. Équivalent à:
SELECT
CASE
WHEN ABS(CHECKSUM(NEWID())) % 4 = 0 THEN 'Dr'
WHEN ABS(CHECKSUM(NEWID())) % 4 = 1 THEN 'Master'
WHEN ABS(CHECKSUM(NEWID())) % 4 = 2 THEN 'Mr'
WHEN ABS(CHECKSUM(NEWID())) % 4 = 3 THEN 'Mrs'
END
Par conséquent, il peut manquer tous les cas WHEN
et le résultat NULL
.
CAS dans une clause ORDER BY
Nous pouvons utiliser 1,2,3 .. pour déterminer le type de commande:
SELECT * FROM DEPT
ORDER BY
CASE DEPARTMENT
WHEN 'MARKETING' THEN 1
WHEN 'SALES' THEN 2
WHEN 'RESEARCH' THEN 3
WHEN 'INNOVATION' THEN 4
ELSE 5
END,
CITY
ID | RÉGION | VILLE | DÉPARTEMENT | EMPLOYEES_NUMBER |
---|---|---|---|---|
12 | Nouvelle-Angleterre | Boston | COMMERCIALISATION | 9 |
15 | Ouest | San Francisco | COMMERCIALISATION | 12 |
9 | Midwest | Chicago | VENTES | 8 |
14 | Mid-Atlantique | New York | VENTES | 12 |
5 | Ouest | Los Angeles | RECHERCHE | 11 |
dix | Mid-Atlantique | crême Philadelphia | RECHERCHE | 13 |
4 | Midwest | Chicago | INNOVATION | 11 |
2 | Midwest | Detroit | RESSOURCES HUMAINES | 9 |
Utilisation de CASE dans UPDATE
échantillon sur les augmentations de prix:
UPDATE ItemPrice
SET Price = Price *
CASE ItemId
WHEN 1 THEN 1.05
WHEN 2 THEN 1.10
WHEN 3 THEN 1.15
ELSE 1.00
END
CASE utilise pour les valeurs NULL ordonnées en dernier
de cette manière, '0' représentant les valeurs connues est classé en premier, '1' représentant les valeurs NULL sont triés en fonction du dernier:
SELECT ID
,REGION
,CITY
,DEPARTMENT
,EMPLOYEES_NUMBER
FROM DEPT
ORDER BY
CASE WHEN REGION IS NULL THEN 1
ELSE 0
END,
REGION
ID | RÉGION | VILLE | DÉPARTEMENT | EMPLOYEES_NUMBER |
---|---|---|---|---|
dix | Mid-Atlantique | crême Philadelphia | RECHERCHE | 13 |
14 | Mid-Atlantique | New York | VENTES | 12 |
9 | Midwest | Chicago | VENTES | 8 |
12 | Nouvelle-Angleterre | Boston | COMMERCIALISATION | 9 |
5 | Ouest | Los Angeles | RECHERCHE | 11 |
15 | NUL | San Francisco | COMMERCIALISATION | 12 |
4 | NUL | Chicago | INNOVATION | 11 |
2 | NUL | Detroit | RESSOURCES HUMAINES | 9 |
CASE dans la clause ORDER BY pour trier les enregistrements par la valeur la plus basse de 2 colonnes
Imaginez que vous ayez besoin de trier les enregistrements par la valeur la plus basse de l'une des deux colonnes. Certaines bases de données peuvent utiliser une fonction MIN()
ou LEAST()
non agrégée LEAST()
pour cela ( ... ORDER BY MIN(Date1, Date2)
), mais en SQL standard, vous devez utiliser une expression CASE
.
L'expression CASE
dans la requête ci-dessous examine les colonnes Date1
et Date2
, vérifie quelle colonne a la valeur la plus faible et trie les enregistrements en fonction de cette valeur.
Données d'échantillon
Id | Date1 | Date2 |
---|---|---|
1 | 2017-01-01 | 2017-01-31 |
2 | 2017-01-31 | 2017-01-03 |
3 | 2017-01-31 | 2017-01-02 |
4 | 2017-01-06 | 2017-01-31 |
5 | 2017-01-31 | 2017-01-05 |
6 | 2017-01-04 | 2017-01-31 |
Question
SELECT Id, Date1, Date2
FROM YourTable
ORDER BY CASE
WHEN COALESCE(Date1, '1753-01-01') < COALESCE(Date2, '1753-01-01') THEN Date1
ELSE Date2
END
Résultats
Id | Date1 | Date2 |
---|---|---|
1 | 2017-01-01 | 2017-01-31 |
3 | 2017-01-31 | 2017-01-02 |
2 | 2017-01-31 | 2017-01-03 |
6 | 2017-01-04 | 2017-01-31 |
5 | 2017-01-31 | 2017-01-05 |
4 | 2017-01-06 | 2017-01-31 |
Explication
Comme vous voyez que la ligne avec Id = 1
est la première, parce que Date1
a l'enregistrement le plus bas de la table entière 2017-01-01
, la ligne où Id = 3
est la seconde parce que Date2
est égale à 2017-01-02
etc.
Nous avons donc trié les enregistrements de 2017-01-01
à 2017-01-01
en 2017-01-06
croissant et aucune attention sur laquelle une colonne Date1
ou Date2
sont ces valeurs.