Suche…
Einführung
Der CASE-Ausdruck wird zur Implementierung der If-Then-Logik verwendet.
Syntax
- CASE input_expression
WANN vergleich1, dann Ergebnis1
[WANN2 DICHTER2 Ergebnis ...] ...
[ELSE resultX]
ENDE - FALL
WENN Bedingung1 DANN Ergebnis1
[WENN Bedingung2 dann Ergebnis2] ...
[ELSE resultX]
ENDE
Bemerkungen
Der einfache CASE-Ausdruck gibt das erste Ergebnis zurück, dessen compareX
Wert dem input_expression
.
Der gesuchte CASE-Ausdruck gibt das erste Ergebnis zurück, dessen conditionX
wahr ist.
CASE in SELECT gesucht (entspricht einem booleschen Ausdruck)
Das durchsuchte CASE gibt Ergebnisse zurück, wenn ein boolescher Ausdruck TRUE ist.
(Dies unterscheidet sich vom einfachen Fall, der nur bei einer Eingabe die Gleichwertigkeit prüfen kann.)
SELECT Id, ItemId, Price,
CASE WHEN Price < 10 THEN 'CHEAP'
WHEN Price < 20 THEN 'AFFORDABLE'
ELSE 'EXPENSIVE'
END AS PriceRating
FROM ItemSales
Ich würde | Artikel Identifikationsnummer | Preis | PreisPreis |
---|---|---|---|
1 | 100 | 34,5 | TEUER |
2 | 145 | 2.3 | BILLIG |
3 | 100 | 34,5 | TEUER |
4 | 100 | 34,5 | TEUER |
5 | 145 | 10 | ERSCHWINGLICH |
Mit CASE COUNT die Anzahl der Zeilen in einer Spalte mit einer Bedingung übereinstimmen.
Anwendungsfall
CASE
kann in Verbindung mit SUM
, um nur die Elemente zurückzugeben, die mit einer vordefinierten Bedingung übereinstimmen. (Dies ist ähnlich zu COUNTIF
in Excel.)
Der Trick besteht darin, binäre Ergebnisse zurückzugeben, die Übereinstimmungen anzeigen, sodass die für übereinstimmende Einträge zurückgegebenen "1" für einen Zähler der Gesamtanzahl der Übereinstimmungen summiert werden können.
ItemSales
, Sie möchten mit dieser Tabelle ItemSales
die Gesamtzahl der als "teuer" eingestuften Artikel ermitteln:
Ich würde | Artikel Identifikationsnummer | Preis | PreisPreis |
---|---|---|---|
1 | 100 | 34,5 | TEUER |
2 | 145 | 2.3 | BILLIG |
3 | 100 | 34,5 | TEUER |
4 | 100 | 34,5 | TEUER |
5 | 145 | 10 | ERSCHWINGLICH |
Abfrage
SELECT
COUNT(Id) AS ItemsCount,
SUM ( CASE
WHEN PriceRating = 'Expensive' THEN 1
ELSE 0
END
) AS ExpensiveItemsCount
FROM ItemSales
Ergebnisse:
ItemsCount | ExpensiveItemsCount |
---|---|
5 | 3 |
Alternative:
SELECT
COUNT(Id) as ItemsCount,
SUM (
CASE PriceRating
WHEN 'Expensive' THEN 1
ELSE 0
END
) AS ExpensiveItemsCount
FROM ItemSales
Abkürzung CASE in SELECT
Die Abkürzungsvariante von CASE
wertet einen Ausdruck (normalerweise eine Spalte) anhand einer Reihe von Werten aus. Diese Variante ist etwas kürzer und erspart es, den ausgewerteten Ausdruck immer und immer wieder zu wiederholen. Die ELSE
Klausel kann jedoch weiterhin verwendet werden:
SELECT Id, ItemId, Price,
CASE Price WHEN 5 THEN 'CHEAP'
WHEN 15 THEN 'AFFORDABLE'
ELSE 'EXPENSIVE'
END as PriceRating
FROM ItemSales
Ein Wort der Warnung. Es ist wichtig zu wissen, dass bei Verwendung der kurzen Variante die gesamte Anweisung bei jedem WHEN
ausgewertet wird. Daher die folgende Aussage:
SELECT
CASE ABS(CHECKSUM(NEWID())) % 4
WHEN 0 THEN 'Dr'
WHEN 1 THEN 'Master'
WHEN 2 THEN 'Mr'
WHEN 3 THEN 'Mrs'
END
kann zu einem NULL
Ergebnis führen. Das liegt daran , dass bei jeder WHEN
NEWID()
ist mit einem neuen Ergebnis wieder aufgerufen wird. Gleichwertig:
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
Daher kann es alle WHEN
Fälle verfehlen und als NULL
.
CASE in einer Klausel ORDER BY
Wir können 1,2,3 verwenden, um die Art der Bestellung zu bestimmen
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
ICH WÜRDE | REGION | STADT | ABTEILUNG | EMPLOYEES_NUMBER |
---|---|---|---|---|
12 | Neu England | Boston | MARKETING | 9 |
fünfzehn | Westen | San Francisco | MARKETING | 12 |
9 | Mittlerer Westen | Chicago | DER UMSATZ | 8 |
14 | Mid-Atlantic | New York | DER UMSATZ | 12 |
5 | Westen | Los Angeles | FORSCHUNG | 11 |
10 | Mid-Atlantic | Philadelphia | FORSCHUNG | 13 |
4 | Mittlerer Westen | Chicago | INNOVATION | 11 |
2 | Mittlerer Westen | Detroit | HUMANRESSOURCEN | 9 |
CASE in UPDATE verwenden
Beispiel für Preiserhöhungen:
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-Verwendung für NULL-Werte, die zuletzt bestellt wurden
Auf diese Weise wird die '0', die die bekannten Werte darstellt, an erster Stelle stehen, die '1', die die NULL-Werte darstellt, wird nach dem letzten sortiert:
SELECT ID
,REGION
,CITY
,DEPARTMENT
,EMPLOYEES_NUMBER
FROM DEPT
ORDER BY
CASE WHEN REGION IS NULL THEN 1
ELSE 0
END,
REGION
ICH WÜRDE | REGION | STADT | ABTEILUNG | EMPLOYEES_NUMBER |
---|---|---|---|---|
10 | Mid-Atlantic | Philadelphia | FORSCHUNG | 13 |
14 | Mid-Atlantic | New York | DER UMSATZ | 12 |
9 | Mittlerer Westen | Chicago | DER UMSATZ | 8 |
12 | Neu England | Boston | MARKETING | 9 |
5 | Westen | Los Angeles | FORSCHUNG | 11 |
fünfzehn | NULL | San Francisco | MARKETING | 12 |
4 | NULL | Chicago | INNOVATION | 11 |
2 | NULL | Detroit | HUMANRESSOURCEN | 9 |
CASE in ORDER BY-Klausel zum Sortieren von Datensätzen nach dem niedrigsten Wert von 2 Spalten
Stellen Sie sich vor, Sie müssen Datensätze nach dem niedrigsten Wert einer der beiden Spalten sortieren. Einige Datenbanken könnten für diese Funktion eine nicht aggregierte MIN()
oder LEAST()
Funktion verwenden ( ... ORDER BY MIN(Date1, Date2)
), aber in Standard-SQL müssen Sie einen CASE
Ausdruck verwenden.
Der CASE
Ausdruck in der Abfrage sieht unten an dem Date1
und Date2
Spalten, überprüft , welcher Spalte den niedrigeren Wert, und sortiert die Datensätze in Abhängigkeit von diesem Wert.
Beispieldaten
Ich würde | 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 |
Abfrage
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
Ergebnisse
Ich würde | 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 |
Erläuterung
Wie Sie sehen, steht Zeile mit Id = 1
erster Stelle, da Date1
den niedrigsten Datensatz aus der gesamten Tabelle 2017-01-01
. Zeile mit Id = 3
ist die zweite, da Date2
2017-01-02
entspricht und der zweitniedrigste Wert aus Tabelle ist und so weiter.
Daher haben wir Datensätze von 2017-01-01
bis 2017-01-06
aufsteigend sortiert und es ist nicht zu Date2
in welcher Spalte Date1
oder Date2
diese Werte sind.