SQL Server'da CASE İfadesi ve İç İçe Durum: T-SQL Örneği
Gerçek hayatta Case'e genel bakış!
Yine gerçek hayatta farklı koşulların sonucuna göre farklı eylemler gerçekleştiririz.
Daha fazla detaylandırmak için aşağıdaki örneği inceleyin:
- Uçak biletleri 100 doların altındaysa Los Angeles'ı ziyaret edeceğim.
- Uçak biletleri 100 ila 200 dolar arasındaysa New York'u ziyaret edeceğim
- Uçak biletleri 200 ila 400 dolar arasında olursa Avrupa'ya giderim
- Aksi takdirde yakınlardaki bazı turistik yerleri ziyaret etmeyi tercih edeceğim.
Koşul ve Eylem'i aşağıdaki örnekten ayrı olarak kategorize etmeyi düşünelim:
Koşullar - Uçuş biletleri | Gerçekleştirilen işlemler, yalnızca Koşul şu şekildeyse: DOĞRU |
Less $ 100’den | Los Angeles'ı ziyaret edin |
100 - 200 $ arası | New York'u ziyaret edin |
200 - 400 $ arası | Avrupa'yı ziyaret edin |
Yukarıdaki koşulların hiçbiri karşılanmadı | Yakındaki turistik yer |
Yukarıdaki örnekte, farklı koşulların sonucunun ayrı eylemleri yönettiğini görebiliriz. Örneğin, Ziyaretçi New York'u ziyaret etme eylemini yalnızca uçak biletinin 100 ila 200 ABD Doları arasında olması koşuluyla gerçekleştirecektir.
Benzer şekilde, MS SQL CASE deyimi aynı zamanda farklı koşulların sonucuna bağlı olarak farklı T-SQL deyimlerini yürütme eylemini gerçekleştirme olanağı da sağlar.
SQL Server'da CASE İfadesi nedir?
SQL Server'da CASE İfadesi IF…ELSE ifadesinin uzantısıdır. Yalnızca maksimum bir koşula izin verilen IF…ELSE'den farklı olarak CASE, kullanıcının MS SQL'de farklı eylem kümeleri gerçekleştirmek için birden fazla koşulu uygulamasına olanak tanır. Kullanıcı tarafından tanımlanan koşula karşılık gelen değeri döndürür.
Aşağıdaki bölümlerde SQL'de Case'in nasıl kullanılacağını ve kavramını öğreneceğiz.
In MS SQL, iki tür CASE vardır.
- Basit VAKA
- CASE arandı
Basit VAKA
Basit Durum için sözdizimi
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]
Burada,
- Parametre Vaka_İfadesi sonunda karşılaştırılacağımız ifadeyi belirtir Değer_1, Değer_2, ...
- Parametreler Açıklama_1, Açıklama_2… Case_Expression durumunda yürütülecek İfadeleri belirtir = Değer_1, Vaka_İfadesi = Değer_2,… vb.
- Özetle, koşul Case_Expression olup olmadığı = Değer_N ve ACTION, Bildirim_N'nin yürütülmesidir, eğer yukarıdaki sonuç DOĞRU.
- TAKMA AD isteğe bağlıdır ve SQL Server CASE deyimi sonucuna verilen takma addır. Çoğunlukla SQL sunucusu seçim cümlesinde Case'i kullandığımızda kullanılır.
Basit Durum Kuralları
- Basit Durum yalnızca Değer_1 ile Değer_N arasındaki Durum_İfadesinin eşitlik kontrolüne izin verir.
- Vaka_İfadesi, ilk değerden (Değer_1) başlayarak sırayla Değer ile karşılaştırılır. Aşağıda yürütme yaklaşımı verilmiştir:
- Case_Expression, Value_1'e eşdeğerse, daha fazla WHEN…THEN ifadesi atlanır ve CASE yürütmesi hemen SONLANIR.
- Vaka_İfadesi Değer_1 ile eşleşmiyorsa, eşdeğerlik açısından Vaka_İfadesi Değer_2 ile karşılaştırılır. Vaka_İfadesini Değer ile karşılaştırmaya yönelik bu süreç, Vaka_İfadesi Değer_1, Değer_2,… kümesinden eşleşen eşdeğer değeri bulana kadar devam edecektir.
- Hiçbir şey eşleşmezse, kontrol ELSE ifadesine gider ve Statement_Else yürütülür.
- BAŞKA isteğe bağlıdır.
- ELSE yoksa ve Case_Expression hiçbir değerle eşleşmiyorsa, o zaman Boş görüntülenecektir.
Aşağıdaki Diyagram Basit Durumun yürütme akışını göstermektedir.
Örnekler
Varsayım: Aşağıdaki gibi bir tabloya sahip olduğumuzu varsayalım. 'Guru99' aşağıda gösterildiği gibi iki sütun ve dört satırla:
Kullanacağız 'Guru99' diğer örneklerdeki tablo
Sorgu 1: BAŞKA HAYIR seçeneğiyle BASİT DURUM
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
Sonuç: Aşağıdaki diyagram BAŞKA HİÇBİR ŞEKİLDE BASİT BİR VAKA'nın yürütme akışını açıklamaktadır.
Sorgu 2: ELSE seçeneğiyle BASİT CASE.
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
Sonuç: Aşağıdaki şemada SIMPLE CASE'in ELSE ile yürütme akışı açıklanmaktadır.
CASE arandı
Aranan Vaka sözdizimi
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]
Burada,
- Boolean_Expression_1, … parametresi, DOĞRU veya YANLIŞ olarak değerlendirilecek ifadeyi belirtir.
- Statement_1, Statement_2… parametreleri, karşılık gelen Boolean_Expression_1, Boolean_Expression_2 sonucunun DOĞRU olması durumunda yürütülecek olan İfadeleri belirtir.
- Özetle, Koşul Boolean_Expression_1,...'dir ve yukarıdaki boolean_Expression_1 TRUE ise ACTION, Statement_N'nin yürütülmesidir.
- ALIAS_NAME isteğe bağlıdır ve CASE bildirimi sonucuna verilen takma addır. Çoğunlukla select cümleciğinde CASE kullandığımızda kullanılır.
Aranan Vaka Kuralları
- Basit durumun aksine, Aranan Durum yalnızca eşitlik kontrolüyle sınırlı değildir, aynı zamanda Boole ifadesine de izin verir.
- Boolean ifadesi, ilk Boolean ifadesinden (Boolean_ifadesi_1) başlayarak sırayla değerlendirilir. Aşağıda yürütme yaklaşımı verilmiştir:
- Boolean_expression_1 DOĞRU ise, diğer WHEN…THEN ifadeleri atlanır ve CASE yürütmesi hemen SONLANIR.
- Boolean_expression_1 YANLIŞ ise Boolean_ifadesi_2, DOĞRU koşulu olarak değerlendirilir. Bu Boolean_ifadesini değerlendirme süreci, Boolean_ifadesinden biri TRUE değerini döndürene kadar devam edecektir.
- Hiçbir şey eşleşmezse, kontrol ELSE ifadesine gider ve Statement_Else yürütülür.
- Basit Durumda olduğu gibi ELSE de Arama durumunda isteğe bağlıdır.
- ELSE mevcut değilse ve Boolean_ifadesinden hiçbiri TRUE döndürmüyorsa, Null görüntülenecektir.
Aşağıdaki Diyagram yürütme akışını gösterir Aranan Vaka.
Örnekler
Sorgu 1: BAŞKA HAYIR seçeneğiyle ARAYAN VAKA
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
Sonuç: Aşağıdaki diyagram yürütme akışını açıklar arasında ARADIĞI VAKA ile BAŞKA YOK.
Sorgu 2: ARANAN VAKA ile ELSE seçeneği.
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
Sonuç: Aşağıdaki diyagram yürütme akışını açıklar of ARANAN VAKA ile BAŞKA.
Uygulama yaklaşımı arasındaki fark: SIMPLE ve SEARCH CASE.
Bir bakalım BASİT VAKA aşağıdaki örnek:
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
Burada, 'Eğitici_adı' SQL'deki CASE ifadesinin bir parçasıdır. Daha sonra 'Eğitici_adı' değer her biri ile karşılaştırılır NE ZAMAN değerleri, yani 'SQL'… 'Eğitim_adı' WHEN değerleriyle eşleşene kadar.
Aksine, ARAMA ÖRNEĞİ örneğin yok CASE İfadesi:
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
Burada her biri NE ZAMAN bildirimi vardır onun Koşullu Boole ifadesi. Her Boole ifadesi yani Tutorial_name = 'SQL',… için değerlendirilir DOĞRU YANLIŞ kadar ilk Boolean değerlendiren ifade DOĞRU.
Basit ve aranan durum arasındaki fark
Basit Durum | Aranan Vaka |
---|---|
CASE anahtar sözcüğünden hemen sonra CASE_Expression gelir ve WHEN ifadesinden önce gelir.
Örneğin: |
Case anahtar sözcüğünden sonra WHEN ifadesi gelir ve CASE ile WHEN arasında herhangi bir ifade yoktur.
Örneğin: |
Basit durumda, her WHEN ifadesi için VALUE mevcuttur. Bu Değerler: Value_1, Value_2… Sıralı olarak tek CASE_Expression ile karşılaştırılır. Sonuç, her WHEN İfadesi için DOĞRU/YANLIŞ koşulu için değerlendirilir.
Örneğin: |
Aranan Durumda, her WHEN ifadesi için Boolean_Expression mevcuttur. Bu Boolean_Expressions: Boolean_Expression_1, Boolean_Expression_2,… her WHEN İfadesi için DOĞRU/YANLIŞ koşulunu değerlendirir.
Örneğin: |
Basit Durum yalnızca eşitlik kontrolünü destekler. Yani CASE_Expression = VALUE_1, VALUE_2…
Örneğin: |
Boolean_Expression_N ile Arama Senaryosu, Boole değeriyle sonuçlanan tüm işlemleri destekler. Eşit ve eşit değil operatörlerini içerir.
Örneğin: |
İç içe CASE: IF ELSE içindeki CASE
Biz kullanabilirsiniz EĞER EĞER VAKA içindeki. Aşağıda örnek MS-SQL kodu verilmiştir
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
Yukarıdaki örnekte CASE, IF…ELSE ifadesinin içinde NESTED'tir:
İlk olarak, IF İfadesi yürütülür ve Vaka Durumu mevcutsa SQL Server Yanlışsa ELSE ifadesi yürütülür.
Aksi takdirde SQL'de İç İçe CASE İfadesi içerir. Uçuş bileti değerine bağlı olarak, aşağıdaki sonuçlardan biri gösterilecektir:
- Uçak biletleri 400$'ın üzerindeyse sistem 'Yakın Turist Lokasyonunu Ziyaret Edin' yazacaktır.
- Uçak biletleri 0 ila 100 $ ARASINDA ise sistem 'Los Angeles'ı Ziyaret Edin' yazacaktır.
- Uçak biletleri 101 $ ile 200 $ ARASINDA ise sistem 'New York'u Ziyaret Edin' yazacaktır.
- Uçak biletleri 201 $ ile 400 $ ARASINDA ise sistem 'Avrupa'yı Ziyaret Edin' yazacaktır.
Yuvalanmış CASE: CASE içindeki CASE
SQL'de CASE'i CASE'in içinde kullanabiliriz. Aşağıda örnek MS-SQL kodu verilmiştir
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
Yukarıdaki örnekte CASE, başka bir CASE ifadesinin içinde NESTED'dir:
Sistem dış CASE'in çalıştırılmasıyla başlar. Flight_Ticket < 400 $ ise iç CASE yürütülür.
Uçak bileti değerine bağlı olarak aşağıdaki sonuçlardan biri görüntülenecektir:
- Uçak biletleri 400$'ın üzerindeyse sistem 'Yakın Turist Lokasyonunu Ziyaret Edin' yazacaktır.
- Uçak biletleri 0 ila 100 $ ARASINDA ise sistem 'Los Angeles'ı Ziyaret Edin' yazacaktır.
- Uçak biletleri 101 $ ile 200 $ ARASINDA ise sistem 'New York'u Ziyaret Edin' yazacaktır.
- Uçak biletleri 201 $ ile 400 $ ARASINDA ise sistem 'Avrupa'yı Ziyaret Edin' yazacaktır.
GÜNCELLEMELİ VAKA
Varsayım: Aşağıda gösterildiği gibi iki sütun ve dört satırdan oluşan 'Guru99' tablosuna sahip olduğumuzu varsayalım:
Daha sonraki örneklerde 'Guru99' tablosunu kullanacağız
CASE'i UPDATE ile kullanabiliriz. Aşağıda örnek MS-SQL kodu verilmiştir:
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 )
Yukarıdaki örnekte UPDATE deyiminde CASE kullanılmıştır.
Tutorial_Name Değerine bağlı olarak Tutorial_Name sütunu THEN Statement değeriyle güncellemeyi alacaktır.
- Tutorial_Name = 'SQL' ise SONRA Tutorial_Name'i 'Yapılandırılmış Sorgu dili' olarak güncelleyin
- Eğer Tutorial_Name = 'PL/SQL' ise SONRA Tutorial_Name'i ' olarak güncelleyinOracle PL/SQL'
- Eğer Tutorial_Name = 'MSSQL' ise SONRA Tutorial_Name'i ' olarak güncelleyinMicrosoft SQL'
- Tutorial_Name = 'Hadoop' ise SONRA Tutorial_Name'i 'Apache Hadoop' olarak güncelleyin
Güncellenen değeri kontrol etmek için Guru99 tablosunu sorgulayalım:
VAKA ile Sipariş:
CASE'i Order By ile kullanabiliriz. Aşağıda örnek MS-SQL kodu verilmiştir:
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
Burada CASE Order By ile birlikte kullanılır.
@Order 1 olarak ayarlanır ve ilk olarak Boolean ifadesi DOĞRU olarak değerlendirildiğinde, Koşula Göre Sıralama için Eğitim_Kimliği seçilir
İlginç gerçekler!
- CASE, başka bir CASE'in yanı sıra başka bir IF…ELSE deyiminin içine yerleştirilebilir.
- SELECT'e ek olarak CASE başka bir şeyle de kullanılabilir SQL UPDATE, ORDER BY gibi maddeler.
ÖZET
- MS SQL'de iki tür CASE vardır: Basit CASE ve Aranan CASE
- CASE deyiminde ELSE isteğe bağlıdır.