Ricerca…


introduzione

L'espressione CASE viene utilizzata per implementare la logica if-then.

Sintassi

  • CASE input_expression
    QUANDO compare1 POI risultato1
    [WHEN compare2 THEN result2] ...
    [Risultato ELSEX]
    FINE
  • ASTUCCIO
    WHEN condition1 THEN result1
    [WHEN condition2 THEN result2] ...
    [Risultato ELSEX]
    FINE

Osservazioni

L' espressione CASE semplice restituisce il primo risultato il cui valore compareX è uguale a input_expression .

L' espressione CASE cercata restituisce il primo risultato di cui conditionX è vera.

CASO ricercato in SELEZIONA (corrisponde ad un'espressione booleana)

Il CASE cercato restituisce risultati quando un'espressione booleana è VERA.

(Questo differisce dal caso semplice, che può solo verificare l'equivalenza con un input.)

SELECT Id, ItemId, Price,
  CASE WHEN Price < 10 THEN 'CHEAP'
       WHEN Price < 20 THEN 'AFFORDABLE'
       ELSE 'EXPENSIVE'
  END AS PriceRating
FROM ItemSales
Id Numero identificativo dell'oggetto Prezzo PriceRating
1 100 34.5 COSTOSO
2 145 2.3 A BUON MERCATO
3 100 34.5 COSTOSO
4 100 34.5 COSTOSO
5 145 10 CONVENIENTE

Usa CASE per COUNT il numero di righe in una colonna corrisponde a una condizione.

Caso d'uso

CASE può essere usato insieme a SUM per restituire un conteggio di solo quegli articoli che corrispondono a una condizione predefinita. (È simile a COUNTIF in Excel.)

Il trucco consiste nel restituire risultati binari che indicano le corrispondenze, quindi gli "1" restituiti per le voci corrispondenti possono essere sommati per un conteggio del numero totale di corrispondenze.

Data questa tabella ItemSales , supponiamo che tu voglia conoscere il numero totale di articoli che sono stati classificati come "costosi":

Id Numero identificativo dell'oggetto Prezzo PriceRating
1 100 34.5 COSTOSO
2 145 2.3 A BUON MERCATO
3 100 34.5 COSTOSO
4 100 34.5 COSTOSO
5 145 10 CONVENIENTE

domanda

SELECT 
    COUNT(Id) AS ItemsCount,
    SUM ( CASE 
            WHEN PriceRating = 'Expensive' THEN 1
            ELSE 0
          END
        ) AS ExpensiveItemsCount
FROM ItemSales 

risultati:

ItemsCount ExpensiveItemsCount
5 3

Alternativa:

SELECT 
    COUNT(Id) as ItemsCount,
    SUM (
        CASE PriceRating 
            WHEN 'Expensive' THEN 1
            ELSE 0
        END
       ) AS ExpensiveItemsCount
FROM ItemSales 

Stenografia CASE in SELECT

La variante abbreviata di CASE valuta un'espressione (solitamente una colonna) rispetto a una serie di valori. Questa variante è un po 'più corta e salva ripetutamente l'espressione valutata più volte. La clausola ELSE può ancora essere utilizzata, tuttavia:

SELECT Id, ItemId, Price,
  CASE Price WHEN 5  THEN 'CHEAP'
             WHEN 15 THEN 'AFFORDABLE'
             ELSE         'EXPENSIVE'
  END as PriceRating
FROM ItemSales

Una parola di cautela. È importante rendersi conto che quando si utilizza la variante breve l'intera istruzione viene valutata in ogni WHEN . Pertanto la seguente dichiarazione:

SELECT 
    CASE ABS(CHECKSUM(NEWID())) % 4
        WHEN 0 THEN 'Dr'
        WHEN 1 THEN 'Master'
        WHEN 2 THEN 'Mr'
        WHEN 3 THEN 'Mrs'
    END

può produrre un risultato NULL . Questo perché in ogni WHEN NEWID() viene chiamato di nuovo con un nuovo risultato. Equivalente a:

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

Pertanto può perdere tutti i casi WHEN e risultare NULL .

CASO in una clausola ORDINE DI

Possiamo usare 1,2,3 .. per determinare il tipo di ordine:

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 REGIONE CITTÀ DIPARTIMENTO EMPLOYEES_NUMBER
12 Nuova Inghilterra Boston MARKETING 9
15 ovest San Francisco MARKETING 12
9 Midwest Chicago I SALDI 8
14 Mid-Atlantic New York I SALDI 12
5 ovest Los Angeles RICERCA 11
10 Mid-Atlantic Philadelphia RICERCA 13
4 Midwest Chicago INNOVAZIONE 11
2 Midwest Detroit RISORSE UMANE 9

Utilizzo di CASE in UPDATE

campione sugli aumenti di prezzo:

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

Utilizzare CASE per i valori NULL ordinati per ultimi

in questo modo '0' che rappresenta i valori noti sono classificati per primi, '1' che rappresenta i valori NULL sono ordinati per ultimi:

SELECT ID
      ,REGION
      ,CITY
      ,DEPARTMENT
      ,EMPLOYEES_NUMBER
  FROM DEPT
  ORDER BY 
  CASE WHEN REGION IS NULL THEN 1 
  ELSE 0
  END, 
  REGION
ID REGIONE CITTÀ DIPARTIMENTO EMPLOYEES_NUMBER
10 Mid-Atlantic Philadelphia RICERCA 13
14 Mid-Atlantic New York I SALDI 12
9 Midwest Chicago I SALDI 8
12 Nuova Inghilterra Boston MARKETING 9
5 ovest Los Angeles RICERCA 11
15 NULLO San Francisco MARKETING 12
4 NULLO Chicago INNOVAZIONE 11
2 NULLO Detroit RISORSE UMANE 9

CASE nella clausola ORDER BY per ordinare i record per il valore più basso di 2 colonne

Immagina di aver bisogno di ordinare i record per il valore più basso di una delle due colonne. Alcuni database potrebbero utilizzare una funzione MIN() o LEAST() non aggregata per questo ( ... ORDER BY MIN(Date1, Date2) ), ma in SQL standard, è necessario utilizzare un'espressione CASE .

Il CASE espressione nella domanda sotto esamina i Date1 e Date2 colonne, assegni quale colonna ha il valore più basso, e ordina i record a seconda di questo valore.

Dati di esempio

Id Data1 Data2
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

domanda

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

risultati

Id Data1 Data2
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

Spiegazione

Come vedi riga con Id = 1 è il primo, che a causa Date1 hanno record di più basso da tutta la tabella 2017-01-01 , riga in cui Id = 3 è il secondo che, a causa Date2 equivale a 2017-01-02 che è secondo valore più basso da tavolo e così via.

Così abbiamo ordinato i record dal 2017-01-01 al 2017-01-06 ascendente e nessuna cura su cui una colonna Date1 o Date2 sono quei valori.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow