Problem:
Chcesz użyć instrukcji CASE w SQL.
Przykład:
Masz wyniki z egzaminu exam stół. Musisz przypisać każdy wynik do jednej z następujących wartości tekstowych:'bad result' , 'average result' lub 'good result' . Złe wyniki to te poniżej 40, dobre wyniki to te powyżej 70, a reszta to wyniki średnie.
exam tabela wygląda tak:
| nazwa | wynik |
|---|---|
| Toby Shaw | 56 |
| Casey Watson | 49 |
| Bennie Lynn | 23 |
| Wykorzystanie pasa ruchu | 70 |
| Steff Fox | 85 |
| Oddział Reggie | 40 |
| Gail Kennedy | 66 |
| Brice Mueller | 90 |
Rozwiązanie 1:
SELECT
name,
result,
CASE
WHEN result < 40 THEN 'bad result'
WHEN result > 70 THEN 'good result'
ELSE 'average result'
END AS category
FROM exam;
Tabela wyników wygląda tak:
| nazwa | wynik | kategoria |
|---|---|---|
| Toby Shaw | 56 | średni wynik |
| Casey Watson | 49 | średni wynik |
| Bennie Lynn | 23 | zły wynik |
| Wykorzystanie pasa ruchu | 70 | średni wynik |
| Steff Fox | 85 | dobry wynik |
| Oddział Reggie | 40 | średni wynik |
| Gail Kennedy | 66 | średni wynik |
| Brice Mueller | 90 | dobry wynik |
Dyskusja:
Aby wyświetlić wartość na podstawie określonych warunków, musisz napisać CASE oświadczenie. Składnia to:
CASE WHENTHEN , WHEN THEN , … ELSE END AS
Jeśli condition_1 jest spełniony, to pobrana wartość to value_1 . Jeśli nie, baza danych sprawdza condition_2 . Jeśli condition_2 ma wartość true, to pobrana wartość to value_2 . Jeśli żaden z tych warunków nie jest spełniony, SQL sprawdza po kolei pozostałe warunki, aż do spełnienia jednego z warunków. Jeśli żaden z warunków nie jest spełniony, value_n określony po ELSE jest pobierany.
ELSE część jest opcjonalna. Jeśli go pominiesz i żaden z warunków nie zostanie spełniony, otrzymasz NULL .
Pamiętaj, aby END CASE klauzula, kiedy skończysz ze wszystkimi warunkami. Oczywiście, tak jak w przypadku każdej tworzonej kolumny, możesz zmienić jej nazwę (AS <column_name> ).
W naszym przykładzie 'bad result' jest przypisywana, gdy result < 40, and 'good result' jest przypisywana, gdy result > 70 . Jeśli żaden z tych warunków nie jest spełniony, wartością jest 'average result' . Ponadto, aby nazwać nowo utworzoną kolumnę wartości tekstowych, musisz użyć aliasu (AS Kategoria). W ten sposób otrzymujesz:
CASE
WHEN result < 40 THEN 'bad result'
WHEN result > 70 THEN 'good result'
ELSE 'average result'
END AS category
Ponieważ 'average result' jest przypisany do wyników między 40 i 70 (włącznie), możesz również napisać warunek zamiast ELSE (patrz Rozwiązanie 2 poniżej). Jednak łatwiej jest użyć ELSE .
Rozwiązanie 2:
SELECT
name,
result,
CASE
WHEN result < 40 THEN 'bad result'
WHEN result > 70 THEN 'good result'
WHEN result >= 40 AND result <= 70 THEN 'average result'
END AS category
FROM exam;
Tabela wyników wygląda tak:
| nazwa | wynik | kategoria |
|---|---|---|
| Toby Shaw | 56 | średni wynik |
| Casey Watson | 49 | średni wynik |
| Bennie Lynn | 23 | zły wynik |
| Wykorzystanie pasa ruchu | 70 | średni wynik |
| Steff Fox | 85 | dobry wynik |
| Oddział Reggie | 40 | średni wynik |
| Gail Kennedy | 66 | średni wynik |
| Brice Mueller | 90 | dobry wynik |
Dyskusja:
Ponieważ 'average result' jest przypisany do wyników między 40 i 70 (włącznie), możesz wpisać następujący warunek zamiast ELSE :
WHEN result >= 40 AND result <= 70 THEN 'average result'
Jeśli nie używasz ELSE i nie chcę żadnych NULL s w category kolumna, musisz upewnić się, że zadbałeś o wszystkie możliwe result wartości. Jeśli istnieje result który nie spełnia żadnego z warunków, otrzymasz NULL .
Rozwiązanie 3:
SELECT
name,
result,
CASE
WHEN result < 40 THEN 'bad result'
WHEN result <= 70 THEN 'average result'
ELSE 'good result'
END AS category
FROM exam;
Tabela wyników wygląda tak:
| nazwa | wynik | kategoria |
|---|---|---|
| Toby Shaw | 56 | średni wynik |
| Casey Watson | 49 | średni wynik |
| Bennie Lynn | 23 | zły wynik |
| Wykorzystanie pasa ruchu | 70 | średni wynik |
| Steff Fox | 85 | dobry wynik |
| Oddział Reggie | 40 | średni wynik |
| Gail Kennedy | 66 | średni wynik |
| Brice Mueller | 90 | dobry wynik |
Dyskusja:
Określone warunki w CASE może nie zachodzić na siebie jak w poprzednich rozwiązaniach lub nakładać się jak w tym rozwiązaniu. Pierwszy warunek jest taki sam jak poprzednio – dla result < 40 , category to 'bad result' . Wszystkie wyniki poniżej 40 mają przypisaną tę wartość w tym momencie i nie musisz już nic z nimi robić. Oznacza to, że nie ma potrzeby upewniania się, że result >= 40 w określaniu warunków dla 'average result' – wszystkie wyniki poniżej 40 mają już wartość 'bad result' przydzielony. Wreszcie, dla pozostałych wyników kategoria powinna być 'good result'; prosty ELSE 'good result' dba o to. W ten sposób otrzymujesz:
CASE
WHEN result < 40 THEN 'bad result'
WHEN result <= 70 THEN 'average result'
ELSE 'good result'
END AS category
Uwaga:kolejność warunków w CASE sprawy. Jeśli odwrócisz kolejność pierwszych dwóch warunków (np. jeśli określisz WHEN result <= 70 THEN 'average result' najpierw WHEN result <= 70 THEN 'average result' po drugie), wszystkie wyniki mniejsze lub równe 70 trafić do 'average result' kategorii, bez wyników przypisanych do 'bad result' kategorii.