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.