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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow