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.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow