CASE-lauseke ja sisäkkäinen tapaus SQL Serverissä: T-SQL-esimerkki
Yleiskatsaus Case tosielämään!
Todellisuudessakin suoritamme erilaisia toimia eri olosuhteiden tuloksen mukaan.
Jos haluat tarkentaa, harkitse alla olevaa esimerkkiä:
- Jos lentoliput ovat alle 100 dollaria, vierailen Los Angelesissa.
- Jos lentoliput ovat 100–200 dollaria, vierailen New Yorkissa
- Jos lentoliput ovat 200–400 dollaria, vierailen Euroopassa
- Muuten käyn mieluummin jossain lähellä olevassa turistikohteessa.
Harkitsemme tilan ja toiminnan luokittelua erillään alla olevasta yllä olevasta esimerkistä:
Ehdot - lentoliput | Toimenpiteet suoritettu, vain jos kunto on TOSI |
Less yli 100 dollaria | Vieraile Los Angelesissa |
Välillä $ 100 dollaria 200 | Vieraile New Yorkissa |
Välillä $ 200 dollaria 400 | Vieraile Euroopassa |
Mikään yllä olevista ehdoista ei täyttynyt | Läheinen turistikohde |
Yllä olevassa esimerkissä voimme nähdä, että eri ehtojen tulos hallitsee erillistä toimintaa. Esim. Vierailija suorittaa New Yorkissa vierailun vain siinä kunnossa, että lentolippu on 100–200 dollaria.
Vastaavasti MS SQL CASE -käsky tarjoaa myös mahdollisuuden suorittaa erilaisia T-SQL-käskyjä eri ehtojen tulosten perusteella.
Mikä on CASE-lauseke SQL Serverissä?
CASE-selostus SQL Serverissä on IF…ELSE-lauseen laajennus. Toisin kuin IF…ELSE, jossa vain yksi ehto on sallittu, CASE sallii käyttäjän soveltaa useita ehtoja erilaisten toimintojoukkojen suorittamiseen MS SQL:ssä. Se palauttaa vastaavan arvon, joka liittyy käyttäjän määrittelemään ehtoon.
Opitaan käyttämään Casea SQL:ssä ja sen konseptia seuraavissa osissa.
In MS SQL, on olemassa kahta tyyppiä CASE.
- Yksinkertainen CASE
- Etsittiin CASE
Yksinkertainen CASE
Simple Casen syntaksi
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]
Täällä
- Parametri Case_Expression tarkoittaa ilmaisua, johon meitä lopulta verrataan Arvo_1, Arvo_2,…
- Parametrit Lausunto_1, Lausunto_2… tarkoittaa lauseita, jotka suoritetaan, jos Case_Expression = Arvo_1, tapaus_lauseke = Arvo_2, … ja niin edelleen.
- Pähkinänkuoressa, ehto on tapaus_lauseke = Arvo_N ja ACTION ovat lausekkeen_N suoritus, jos yllä oleva tulos on TOSI.
- ALIAS NIMI on valinnainen ja se on SQL Server CASE -käskyn tulokselle annettu aliasnimi. Useimmiten käytetään, kun käytämme Casea SQL-palvelimen valintalausekkeessa.
Yksinkertaisen tapauksen säännöt
- Yksinkertainen tapaus sallii vain tapauslausekkeen yhtäläisyyden tarkistuksen arvolla Arvo_1 arvoon_N.
- Case_Expression verrataan arvoon järjestyksessä alkaen ensimmäisestä arvosta, eli Arvo_1. Alla on toteutustapa:
- Jos Case_Expression vastaa arvoa_1, muut WHEN…THEN-käskyt ohitetaan ja CASE-suoritus PÄÄTTYY välittömästi.
- Jos tapauslauseke ei vastaa arvoa_1, tapauslauseketta verrataan arvoon_2 vastaavuuden vuoksi. Tämä tapauslausekkeen ja arvon vertaaminen jatkuu, kunnes Case_Expression löytää vastaavan vastaavan arvon joukosta Arvo_1, Arvo_2,…
- Jos mikään ei täsmää, ohjaus siirtyy ELSE-käskyyn, ja lauseke_Else suoritetaan.
- ELSE on valinnainen.
- Jos ELSE ei ole läsnä ja Case_Expression ei vastaa yhtään arvoa, niin Null tulee näkyviin.
Alla oleva kaavio havainnollistaa Simple Casen suorituskulkua.
Esimerkit
Oletus: Oletetaan, että meillä on taulukko muodossa "Guru99" kahdella sarakkeella ja neljällä rivillä alla olevan kuvan mukaisesti:
Käytämme "Guru99" taulukko muissa esimerkeissä
Kysymys 1: YKSINKERTAINEN TAPAUS EI MUUTA -vaihtoehdolla
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
Tulos: Alla olevassa kaaviossa selitetään SIMPLE CASE ilman muuta suorituskulkua.
Kysely 2: YKSINKERTAINEN TAPAUS MUU-vaihtoehdolla.
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
Tulos: Alla oleva kaavio selittää SIMPLE CASE:n suorittamisen ELSE:n kanssa.
Etsittiin CASE
Haetun tapauksen syntaksi
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]
Täällä
- Parametri Boolen_lauseke_1, …merkitsee lauseketta, jonka arvoksi arvioidaan TOSI tai EPÄTOSI.
- Parametrit Lauseke_1, Lauseke_2… osoittavat lauseita, jotka suoritetaan, jos sitä vastaava Boolen_lauseke_1, Boolen_lauseke_2 tulos on TOSI.
- Lyhyesti sanottuna ehto on Boolen_Expression_1,… ja ACTION on lausekkeen_N suoritus, jos edellä oleva Boolen_Expression_1 on TOSI.
- ALIAS_NAME on valinnainen ja se on CASE-käskyn tulokselle annettu aliasnimi. Useimmiten käytetään, kun käytämme valintalauseessa CASE.
Etsityn tapauksen säännöt
- Toisin kuin yksinkertainen tapaus, Haettu tapaus ei rajoitu vain yhtäläisyyden tarkistukseen, vaan se sallii Boolen lausekkeen.
- Boolen lauseke arvioidaan järjestyksessä alkaen ensimmäisestä Boolen lausekkeesta eli Boolen_lauseke_1. Alla on toteutustapa:
- Jos Boolen_lauseke_1 on TOSI, seuraavat WHEN…THEN-lauseet ohitetaan ja CASE-suoritus PÄÄTTYY välittömästi.
- Jos Boolen_lauseke_1 on EPÄTOSI, Boolen_lauseke_2 arvioidaan ehdon TOSI. Tämä Boolen_lausekkeen arviointiprosessi jatkuu, kunnes jokin Boolen_lausekkeesta palauttaa TOSI.
- Jos mikään ei täsmää, ohjaus siirtyy ELSE-käskyyn, ja lauseke_Else suoritetaan.
- Like Simple Case ELSE on valinnainen myös hakutapauksessa.
- Jos ELSE ei ole läsnä eikä mikään Boolen_lausekkeesta palauta TOSI, näyttöön tulee Null.
Alla Kaavio havainnollistaa suorituskulkua Haettu tapaus.
Esimerkit
Kysely 1: HAETTU TAPAUS EI MUUTA -vaihtoehdolla
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
Tulos: Alla kaavio selittää suorituksen kulkua että HAETTU TAPAUS with EI MUUTA.
Kysely 2: HAETTU TAPAUS jossa ELSE vaihtoehto.
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
Tulos: Alla kaavio selittää suorituksen kulkua of HAETTU TAPAUS with MUU.
Ero suoritustavan välillä: SIMPLE ja SEARCH CASE.
Katsotaanpa YKSINKERTAINEN TAPAUS esimerkki alla:
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
Täällä "Tutorial_name" on osa CASE-lauseketta SQL:ssä. Sitten "Tutorial_name" arvoa verrataan kuhunkin Kun arvot, eli SQL… kunnes 'Tutorial_name' vastaa WHEN-arvoja.
Päinvastoin, HAKU TAPAUS esimerkillä ei ole CASE-ilmaisu:
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
Tässä jokainen WHEN-lause on sen Ehdollinen Boolen lauseke. kukin Boolen lauseke eli Tutorial_name = 'SQL',… on arvioitu TOSI/EPÄTOSI asti ensimmäinen Boolean lauseke, joka arvioi arvoon TOSI.
Ero yksinkertaisen ja haetun tapauksen välillä
Yksinkertainen kotelo | Haettu tapaus |
---|---|
CASE-avainsanaa seuraa välittömästi CASE_Expression ja ennen WHEN-lausetta.
Esim: |
Case-avainsanaa seuraa WHEN-lause, eikä CASE- ja WHEN-välillä ole lauseketta.
Esim: |
Yksinkertaisessa tapauksessa VALUE on olemassa jokaiselle WHEN-käskylle. Näitä arvoja: Arvo_1, Arvo_2… Verrataan yksittäiseen CASE_Expression-lauseeseen peräkkäin. Tulos saa arvion TOSI/EPÄTOSI -ehdon suhteen jokaiselle WHEN-lausekkeelle.
Esim: |
Haetussa tapauksessa Boolean_Expression on olemassa jokaiselle WHEN-käskylle. Tämä Boolen_lausekkeet: Boolen_lauseke_1, Boolen_lauseke_2,… arvioi kunkin WHEN-lausekkeen TOSI/EPÄTOSI-ehdon.
Esim: |
Simple Case tukee vain tasa-arvon tarkistusta. Eli onko CASE_Expression = VALUE_1, VALUE_2…
Esim: |
Boolen_Expression_N:n avulla Search Case tukee kaikkia toimintoja, jotka johtavat Boolen arvoon. Se sisältää yhtä kuin operaattorin.
Esim: |
Sisäkkäinen CASE: CASE kohdassa IF ELSE
Voimme käyttää CASE sisällä JOS MUUTA. Alla on esimerkki MS-SQL-koodista
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
Yllä olevassa esimerkissä CASE on NESTED IF…ELSE-käskyn sisällä:
Ensinnäkin IF-lausunto suoritetaan ja jos tapauksen ehto sisään SQL-palvelin on False, ELSE-lause suoritetaan.
Muut sisältävät sisäkkäisen CASE-lausekkeen SQL:ssä. Lentolipun arvosta riippuen yksi seuraavista tuloksista näytetään:
- Jos lentoliput ovat yli 400 dollaria, järjestelmä tulostaa "Visit Nearby Tourist Location".
- Järjestelmä tulostaa "Visit Los Angeles", jos lentoliput ovat 0 - 100 $
- Järjestelmä tulostaa "Visit New York", jos lentoliput ovat 101 - 200 $
- Järjestelmä tulostaa "Visit Europe", jos lentoliput ovat 201 - 400 $
Sisäkkäinen CASE: CASE CASE:n sisällä
Voimme käyttää CASEa CASE:n sisällä SQL:ssä. Alla on esimerkki MS-SQL-koodista
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
Yllä olevassa esimerkissä CASE on NESTED toisen CASE-käskyn sisällä:
Järjestelmä aloittaa ulkoisen CASE:n suorittamisen. Jos Flight_Ticket < 400 dollaria, sisäinen CASE suoritetaan.
Lentolipun arvosta riippuen yksi seuraavista tuloksista näytetään:
- Jos lentoliput ovat yli 400 dollaria, järjestelmä tulostaa "Visit Nearby Tourist Location".
- Järjestelmä tulostaa "Visit Los Angeles", jos lentoliput ovat 0 - 100 $
- Järjestelmä tulostaa "Visit New York", jos lentoliput ovat 101 - 200 $
- Järjestelmä tulostaa "Visit Europe", jos lentoliput ovat 201 - 400 $
TAPAUS PÄIVITYKSEN kanssa
Oletus: Oletetaan, että meillä on taulukko "Guru99", jossa on kaksi saraketta ja neljä riviä, kuten alla näytetään:
Käytämme 'Guru99'-taulukkoa muissa esimerkeissä
Voimme käyttää CASEa UPDATE:n kanssa. Alla on esimerkki MS-SQL-koodista:
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 )
Yllä olevassa esimerkissä CASEa käytetään UPDATE-käskyssä.
Tutorial_Name-arvosta riippuen Tutorial_Name-sarake saa päivityksen THEN-lausekkeen arvolla.
- Jos Tutorial_Name = 'SQL', päivitä Tutorial_Name kieleksi "Structured Query Language"
- Jos Tutorial_Name = 'PL/SQL', päivitä Tutorial_Name arvoon 'Oracle PL/SQL'
- Jos Tutorial_Name = 'MSSQL', päivitä Tutorial_Name muotoon 'Microsoft SQL'
- Jos Tutorial_Name = 'Hadoop', päivitä Tutorial_Name muotoon 'Apache Hadoop'
Tarkastetaan päivitetty arvo Guru99-taulukosta:
TAPAUS tilauksella
Voimme käyttää CASEa tilausperusteella. Alla on esimerkki MS-SQL-koodista:
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
Tässä CASEa käytetään tilausperusteen kanssa.
@Order asetetaan arvoon 1 ja kun ensimmäinen Boolen lauseke laskee arvoon TOSI, Tutorial_ID valitaan Tilaa ehdon mukaan
Mielenkiintoisia seikkoja!
- CASE voidaan upottaa toiseen CASE- tai toiseen IF…ELSE-käskyyn.
- SELECT:n lisäksi CASE:ta voidaan käyttää toisen kanssa SQL lauseke kuten UPDATE, ORDER BY.
Yhteenveto
- MS SQL:ssä on kahta tyyppiä CASE: Simple CASE ja Searched CASE
- ELSE on valinnainen CASE-käskyssä.