Instrukcja CASE i zagnieżdżona wielkość liter w SQL Server: przykład T-SQL
⚡ Inteligentne podsumowanie
CASE to wyrażenie warunkowe w programie SQL Server zwracające wartość na podstawie pierwszego warunku, którego wynikiem jest prawda, oferujące formy prostą i wyszukiwaną, a także zagnieżdżanie wewnątrz IF…ELSE, UPDATE i ORDER BY.

Przegląd przypadku w prawdziwym życiu!
Ponownie, w życiu realnym wykonujemy różne czynności w zależności od rezultatu różnych warunków. Aby to rozwinąć, rozważmy poniższy przykład:
- Jeśli bilety lotnicze będą tańsze niż 100 dolarów, odwiedzę Los Angeles.
- Jeśli cena biletów lotniczych wynosi od 100 do 200 dolarów, to pojadę do Nowego Jorku.
- Jeśli cena biletów lotniczych będzie wynosić od 200 do 400 dolarów, to odwiedzę Europę.
- W przeciwnym razie wolę odwiedzić pobliską atrakcję turystyczną.
Rozważmy kategoryzację warunku i działania oddzielnie od powyższego przykładu:
| Warunki – Bilety lotnicze | Akcje wykonywane tylko wtedy, gdy warunek jest PRAWDĄ |
| Less niż 100 USD | Odwiedź Los Angeles |
| Między $ 100 a $ 200 | Odwiedź Nowy Jork |
| Między $ 200 a $ 400 | Odwiedź Europę |
| Żaden z powyższych warunków nie został spełniony | Pobliski punkt turystyczny |
W powyższym przykładzie widać, że wynik różnych warunków decyduje o odrębnym działaniu. Na przykład, odwiedzający wykona czynność odwiedzenia Nowego Jorku tylko pod warunkiem, że cena biletu lotniczego mieści się w przedziale od 100 do 200 dolarów. Podobnie, MS SQL Polecenie CASE umożliwia również wykonywanie różnych poleceń T-SQL na podstawie rezultatu różnych warunków.
Co to jest instrukcja CASE w SQL Server?
SPRAWA Oświadczenie w SQL Server jest rozszerzeniem JEŚLI INACZEJ Instrukcja. W przeciwieństwie do instrukcji IF…ELSE, gdzie dozwolony jest maksymalnie jeden warunek, instrukcja CASE pozwala użytkownikowi zastosować wiele warunków w celu wykonania różnych zestawów działań w MS SQL. Zwraca ona odpowiednią wartość powiązaną z warunkiem zdefiniowanym przez użytkownika.
Nauczmy się używać CASE w SQL i jego koncepcję w kolejnych sekcjach. W MS SQL istnieją dwa typy instrukcji CASE:
- Prosty PRZYPADEK
- Przeszukany przypadek
Prosty PRZYPADEK
Składnia dla przypadku prostego
CASE <Case_Expression> WHEN Value_1 THEN Statement_1 WHEN Value_2 THEN Statement_2 . . WHEN Value_N THEN Statement_N [ELSE Statement_Else] END AS [ALIAS_NAME]
Tutaj:
- Parametr Case_Expression oznacza wyrażenie, które ostatecznie zostanie porównane z Value_1, Value_2 itd.
- Parametry Statement_1, Statement_2… oznaczają instrukcje, które zostaną wykonane, jeżeli Case_Expression = Value_1, Case_Expression = Value_2 itd.
- Krótko mówiąc, warunkiem jest to, czy Case_Expression = Value_N, a działaniem jest wykonanie Statement_N, jeśli powyższy wynik ma wartość TRUE.
- ALIAS_NAME jest opcjonalny i stanowi nazwę aliasu nadaną wynikowi instrukcji CASE w SQL Server. Jest używany głównie wtedy, gdy używamy instrukcji CASE w klauzuli SELECT w SQL Server.
Zasady dla prostych przypadków
- Simple Case pozwala jedynie na sprawdzenie równości Case_Expression z Value_1 i Value_N.
- Wyrażenie Case_Expression jest porównywane z wartością, w kolejności, zaczynając od pierwszej wartości, tj. Value_1. Poniżej przedstawiono podejście do wykonania:
- Jeśli Case_Expression jest równoważne Value_1, wówczas dalsze instrukcje WHEN…THEN są pomijane, a wykonanie CASE natychmiast się ZAKOŃCZY.
- Jeśli Case_Expression nie pasuje do Value_1, wówczas Case_Expression jest porównywane z Value_2 w celu sprawdzenia równoważności. Proces porównywania Case_Expression z wartością jest kontynuowany, aż Case_Expression znajdzie pasującą równoważną wartość z zestawu Value_1, Value_2 itd.
- Jeżeli nic nie pasuje, sterowanie przechodzi do instrukcji ELSE i wykonywana jest instrukcja Statement_Else.
- ELSE jest opcjonalne.
- Jeżeli ELSE nie jest obecne i Case_Expression nie pasuje do żadnej z wartości, wyświetlana jest wartość NULL.
Poniższy diagram ilustruje przepływ wykonania prostego przypadku:
Przykłady
Załóżmy, że mamy tabelę o nazwie „Guru99' z dwiema kolumnami, Tutorial_ID i Tutorial_name, oraz czterema wierszami, jak pokazano poniżej. Użyjemy tego 'Guru99' tabela w poniższych przykładach.
Zapytanie 1: PROSTY PRZYPADEK z opcją NIE WIĘCEJ
SELECT Tutorial_ID, Tutorial_name, CASE Tutorial_name WHEN 'SQL' THEN 'SQL is developed by IBM' WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' END AS Description FROM Guru99
Wynik: Poniższy diagram wyjaśnia przepływ wykonania w PRZYPADKU PROSTYM BEZ ŻADNYCH INNYCH.
Zapytanie 2: SIMPLE CASE z opcją ELSE
SELECT Tutorial_ID, Tutorial_name, CASE Tutorial_name WHEN 'SQL' THEN 'SQL is developed by IBM' WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' ELSE 'This is NO SQL language.' END AS Description FROM Guru99
Wynik: Poniższy diagram wyjaśnia przepływ wykonania instrukcji SIMPLE CASE z instrukcją ELSE.
Przeszukany przypadek
Składnia dla przeszukiwanego przypadku
CASE WHEN <Boolean_Expression_1> THEN Statement_1 WHEN <Boolean_Expression_2> THEN Statement_2 . . WHEN <Boolean_Expression_N> THEN Statement_N [ELSE Statement_Else] END AS [ALIAS_NAME]
Tutaj:
- Parametr Boolean_Expression_1… oznacza wyrażenie, które zostanie ocenione pod kątem wartości PRAWDA lub FAŁSZ.
- Parametry Statement_1, Statement_2… oznaczają instrukcje, które zostaną wykonane, jeśli odpowiadający im wynik Boolean_Expression_1, Boolean_Expression_2 ma wartość TRUE.
- Krótko mówiąc, warunkiem jest Boolean_Expression_1… a działaniem jest wykonanie Statement_N, jeśli powyższe Boolean_Expression_1 ma wartość TRUE.
- ALIAS_NAME jest opcjonalny i stanowi nazwę aliasu nadaną wynikowi instrukcji CASE. Jest używany głównie wtedy, gdy używamy instrukcji CASE w klauzuli SELECT.
Zasady przeszukiwanej sprawy
- W przeciwieństwie do przypadku prostego, przypadek przeszukiwany nie jest ograniczony wyłącznie do sprawdzenia równości, ale pozwala na użycie wyrażenia boolowskiego.
- Wyrażenie boolowskie jest oceniane w kolejności, zaczynając od pierwszego wyrażenia boolowskiego, tj. Boolean_Expression_1. Poniżej przedstawiono sposób wykonania:
- Jeśli Boolean_Expression_1 ma wartość TRUE, wówczas dalsze instrukcje WHEN…THEN zostaną pominięte, a wykonywanie instrukcji CASE zakończy się natychmiast.
- Jeśli Boolean_Expression_1 ma wartość FALSE, wówczas Boolean_Expression_2 jest oceniane pod kątem wartości TRUE. Proces oceny wyrażenia boolowskiego jest kontynuowany, aż jedno z wyrażeń boolowskich zwróci wartość TRUE.
- Jeżeli nic nie pasuje, sterowanie przechodzi do instrukcji ELSE i wykonywana jest instrukcja Statement_Else.
- Podobnie jak w przypadku prostym, ELSE jest opcjonalne również w przypadku przeszukiwanym.
- Jeżeli ELSE nie jest obecne i żadne z wyrażeń boolowskich nie zwraca TRUE, wyświetlana jest wartość NULL.
Poniższy diagram ilustruje przepływ wykonywania przeszukiwanego przypadku:
Przykłady
Zapytanie 1: SEARCHED CASE z opcją NO ELSE
SELECT Tutorial_ID, Tutorial_name, CASE WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM' WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' END AS Description FROM Guru99
Wynik: Poniższy diagram wyjaśnia przepływ wykonania polecenia SEARCHED CASE bez opcji ELSE.
Zapytanie 2: WYSZUKIWANY PRZYPADEK z opcją ELSE
SELECT Tutorial_ID, Tutorial_name, CASE WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM' WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' ELSE 'This is NO SQL language.' END AS Description FROM Guru99
Wynik: Poniższy diagram wyjaśnia przepływ wykonania instrukcji SEARCHED CASE z instrukcją ELSE.
Różnica między podejściem wykonawczym: SIMPLE i SEARCH CASE
Przyjrzyjmy się poniższemu PROSTEMU PRZYPADKOWI:
SELECT Tutorial_ID, Tutorial_name, CASE Tutorial_name WHEN 'SQL' THEN 'SQL is developed by IBM' WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' ELSE 'This is NO SQL language.' END AS Description FROM Guru99
Tutaj „Tutorial_name” jest częścią wyrażenia CASE w SQL. Następnie wartość „Tutorial_name” jest porównywana z każdą wartością WHEN, tj. „SQL”… aż „Tutorial_name” będzie pasować do wartości WHEN.
W przeciwieństwie do tego przykład SEARCH CASE nie zawiera żadnego wyrażenia CASE:
SELECT Tutorial_ID, Tutorial_name, CASE WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM' WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' END AS Description FROM Guru99
Tutaj każde polecenie WHEN ma własne warunkowe wyrażenie boolowskie. Każde wyrażenie boolowskie, np. Tutorial_name = 'SQL'…, jest oceniane pod kątem PRAWDA/FAŁSZ, aż do pierwszego wyrażenia boolowskiego, które da PRAWDĘ.
Różnica między przypadkiem prostym a przeszukiwanym
| Prosta sprawa | Przeszukana sprawa |
| Po słowie kluczowym CASE następuje bezpośrednio CASE_Expression, a przed nim znajduje się polecenie WHEN.
Na przykład: |
Po słowie kluczowym CASE następuje polecenie WHEN, przy czym między CASE i WHEN nie ma żadnego wyrażenia.
Na przykład: |
| W prostym przypadku dla każdego polecenia WHEN istnieje WARTOŚĆ. Wartości te (Wartość_1, Wartość_2…) są sekwencyjnie porównywane z pojedynczym wyrażeniem CASE_Expression. Wynik jest oceniany pod kątem warunku PRAWDA/FAŁSZ dla każdego polecenia WHEN.
Na przykład: |
W przypadku przeszukiwanym dla każdego polecenia WHEN istnieje wyrażenie logiczne (Boolean_Expression). Te wyrażenia logiczne (Boolean_Expression_1, Boolean_Expression_2…) oceniają warunek PRAWDA/FAŁSZ dla każdego polecenia WHEN.
Na przykład: |
| Prosty przypadek obsługuje tylko sprawdzanie równości, tzn. czy CASE_Expression = VALUE_1, VALUE_2…
Na przykład: |
Dzięki Boolean_Expression_N, przypadek przeszukiwany obsługuje każdą operację, której wynikiem jest wartość logiczna. Obejmuje to operatory równości i nierówności.
Na przykład: |
Zagnieżdżony CASE: CASE w IF ELSE
Możemy użyć instrukcji CASE wewnątrz instrukcji IF…ELSE. Deklarujemy zmienna dla biletu lotniczego i odgałęzienia o jego wartości. Poniżej przykładowy kod MS-SQL:
DECLARE @Flight_Ticket int; SET @Flight_Ticket = 190; IF @Flight_Ticket > 400 PRINT 'Visit Nearby Tourist Location'; ELSE BEGIN SELECT CASE WHEN @Flight_Ticket BETWEEN 0 AND 100 THEN 'Visit Los Angeles' WHEN @Flight_Ticket BETWEEN 101 AND 200 THEN 'Visit New York' WHEN @Flight_Ticket BETWEEN 201 AND 400 THEN 'Visit Europe' END AS Location END
W powyższym przykładzie instrukcja CASE jest zagnieżdżona w instrukcji IF…ELSE. Najpierw wykonywana jest instrukcja IF, a jeśli warunek CASE w SQL Server ma wartość False, wykonywana jest instrukcja ELSE. Część ELSE zawiera zagnieżdżoną instrukcję CASE w SQL. W zależności od wartości biletu lotniczego wyświetlany jest jeden z poniższych wyników:
- System wyświetla komunikat „Odwiedź pobliskie miejsce turystyczne”, jeśli cena biletów lotniczych jest wyższa niż 400 USD.
- System wyświetla komunikat „Odwiedź Los Angeles”, jeśli cena biletów lotniczych mieści się w przedziale od 0 do 100 USD.
- System wyświetla komunikat „Odwiedź Nowy Jork”, jeśli cena biletów lotniczych mieści się w przedziale od 101 do 200 dolarów.
- System wyświetla komunikat „Odwiedź Europę”, jeśli cena biletów lotniczych mieści się w przedziale od 201 do 400 dolarów.
Poniższy wynik pokazuje lokalizację zwracaną, gdy zagnieżdżone CASE jest uruchamiane wewnątrz gałęzi ELSE:
Zagnieżdżony CASE: CASE wewnątrz CASE
W SQL możemy używać instrukcji CASE wewnątrz innej instrukcji CASE. Poniżej znajduje się przykładowy kod MS-SQL:
DECLARE @Flight_Ticket int; SET @Flight_Ticket = 250; SELECT CASE WHEN @Flight_Ticket >= 400 THEN 'Visit Nearby Tourist Location.' WHEN @Flight_Ticket < 400 THEN CASE WHEN @Flight_Ticket BETWEEN 0 AND 100 THEN 'Visit Los Angeles' WHEN @Flight_Ticket BETWEEN 101 AND 200 THEN 'Visit New York' WHEN @Flight_Ticket BETWEEN 201 AND 400 THEN 'Visit Europe' END END AS Location
W powyższym przykładzie instrukcja CASE jest zagnieżdżona w innej instrukcji CASE. System najpierw wykonuje zewnętrzną instrukcję CASE; jeśli Flight_Ticket < 400 USD, uruchamiana jest wewnętrzna instrukcja CASE. Zwrócona lokalizacja pokrywa się z zakresem biletów, co w poprzednim przykładzie, więc bilet za 250 USD mieści się w przedziale 201–400 USD i zwraca komunikat „Visit Europe”.
Poniższy wynik przedstawia lokalizację zwróconą przez funkcję wewnętrzną CASE dla biletu o wartości 250 USD:
CASE z AKTUALIZACJĄ
Załóżmy ponownie, że mamy „GuruTabela 99' z dwiema kolumnami i czterema wierszami, jak pokazano poniżej:
Możemy użyć CASE z UPDATE. Poniżej znajduje się przykładowy kod MS-SQL:
UPDATE Guru99 SET Tutorial_Name = ( CASE WHEN Tutorial_Name = 'SQL' THEN 'Structured Query language.' WHEN Tutorial_Name = 'PL/SQL' THEN 'Oracle PL/SQL' WHEN Tutorial_Name = 'MSSQL' THEN 'Microsoft SQL.' WHEN Tutorial_Name = 'Hadoop' THEN 'Apache Hadoop.' END )
W powyższym przykładzie w poleceniu UPDATE użyto instrukcji CASE. W zależności od wartości Tutorial_Name, kolumna Tutorial_Name jest aktualizowana wartością polecenia THEN:
- Jeżeli Tutorial_Name = 'SQL', zaktualizuj Tutorial_Name do 'Język zapytań strukturalnych'.
- Jeśli Tutorial_Name = 'PL/SQL', zaktualizuj Tutorial_Name do 'Oracle PL/SQL'.
- Jeśli Tutorial_Name = 'MSSQL', zaktualizuj Tutorial_Name do 'Microsoft 'SQL'.
- Jeżeli Tutorial_Name = 'Hadoop', zaktualizuj Tutorial_Name do 'Apache Hadoop'.
Uruchomienie polecenia aktualizuje pasujące wiersze, jak pokazano poniżej:
Zapytajmy „GuruTabela 99' służąca do sprawdzania zaktualizowanych wartości:
CASE z zamówieniem
Możemy użyć instrukcji CASE z ORDER BY. Poniżej znajduje się przykładowy kod MS-SQL:
Declare @Order Int; Set @Order = 1 Select * from Guru99 order by CASE WHEN @Order = 1 THEN Tutorial_ID WHEN @Order = 2 THEN Tutorial_Name END DESC
Tutaj użyto CASE z ORDER BY. @Order jest ustawione na 1, a ponieważ pierwsze wyrażenie boolowskie WHEN ma wartość TRUE, dla warunku ORDER BY wybrano Tutorial_ID. Wynik pokazano poniżej:
Interesujące fakty!
- Instrukcja CASE może być zagnieżdżona w innej instrukcji CASE, jak również w instrukcji IF…ELSE.
- Oprócz SELECT, CASE można używać z innymi klauzulami SQL, takimi jak UPDATE i ORDER BY.













