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.