SQL Server'da CASE İfadesi ve İç İçe Durum: T-SQL Örneği
⚡ Akıllı Özet
CASE, SQL Server'da koşullu bir ifadedir ve doğru olarak değerlendirilen ilk koşula bağlı olarak bir değer döndürür; basit ve aramalı formların yanı sıra IF…ELSE, UPDATE ve ORDER BY içinde iç içe kullanım imkanı sunar.

Gerçek hayatta Case'e genel bakış!
Yine, gerçek hayatta, farklı koşulların sonucuna bağlı olarak farklı eylemler gerçekleştiririz. Daha ayrıntılı açıklamak gerekirse, aşağıdaki örneği ele alalım:
- Uçak biletleri 100 doların altındaysa Los Angeles'ı ziyaret edeceğim.
- Uçak biletleri 100 ile 200 dolar arasındaysa, New York'u ziyaret edeceğim.
- Uçak biletleri 200 ile 400 dolar arasındaysa, Avrupa'yı ziyaret edeceğim.
- Aksi takdirde, yakındaki bir turistik yeri ziyaret etmeyi tercih ederim.
Yukarıdaki örnekten yola çıkarak, durumu ve eylemi ayrı ayrı kategorize etmeyi ele alalım:
| Şartlar – Uçak Biletleri | Eylemler yalnızca Koşul DOĞRU ise gerçekleştirilir. |
| 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ı bir eylemi yönettiğini görebiliriz. Örneğin, ziyaretçi New York'u ziyaret etme eylemini ancak uçak biletinin fiyatı 100 ile 200 dolar arasında olduğunda gerçekleştirecektir. Benzer şekilde, MS SQL CASE ifadesi, farklı koşulların sonucuna bağlı olarak farklı T-SQL ifadelerini çalıştırma olanağı da sağlar.
SQL Server'da CASE İfadesi nedir?
VAKA Açıklaması SQL Server 'nin uzantısıdır EĞER…ELSE IF…ELSE yapısında en fazla bir koşula izin verilirken, CASE yapısı kullanıcının MS SQL'de farklı eylem kümeleri gerçekleştirmek için birden fazla koşul uygulamasına olanak tanır. Kullanıcı tarafından tanımlanan koşulla ilişkili karşılık gelen bir değer döndürür.
CASE yapısını nasıl kullanacağımızı öğrenelim. SQL ve kavramı aşağıdaki bölümlerde açıklanacaktır. MS SQL'de iki tür CASE ifadesi vardır:
- Basit VAKA
- CASE arandı
Basit VAKA
Basit Durum İç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]
İşte:
- Case_Expression parametresi, Value_1, Value_2 ve benzerleriyle karşılaştırılacak olan ifadeyi belirtir.
- Statement_1, Statement_2… parametreleri, Case_Expression = Value_1, Case_Expression = Value_2 ve benzeri durumlarda yürütülecek ifadeleri belirtir.
- Özetle, koşul Case_Expression = Value_N olup olmadığıdır ve işlem, yukarıdaki sonuç DOĞRU ise Statement_N'nin yürütülmesidir.
- ALIAS_NAME isteğe bağlıdır ve SQL Server CASE ifadesinin sonucuna verilen takma addır. Çoğunlukla SQL Server SELECT yan tümcesinde CASE kullandığımızda kullanılır.
Basit Durum Kuralları
- Basit Durum, yalnızca Case_Expression'ın Value_1 ile Value_N arasındaki değerlerle eşitlik kontrolüne izin verir.
- Case_Expression, ilk değerden (yani Value_1'den) başlayarak sırayla bir değerle karşılaştırılır. Aşağıda uygulama 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.
- Eğer Case_Expression, Value_1 ile eşleşmiyorsa, Case_Expression, eşdeğerlik açısından Value_2 ile karşılaştırılır. Case_Expression'ın bir değerle karşılaştırılması işlemi, Case_Expression, Value_1, Value_2 ve benzeri değerler kümesinden eşleşen bir değer bulana kadar devam eder.
- Eğer hiçbir eşleşme bulunmazsa, kontrol ELSE ifadesine geçer ve Statement_Else yürütülür.
- BAŞKA isteğe bağlıdır.
- Eğer ELSE ifadesi yoksa ve Case_Expression değerlerden hiçbiriyle eşleşmiyorsa, NULL görüntülenir.
Aşağıdaki diyagram, basit bir durumun yürütme akışını göstermektedir:
Örnekler
' adında bir tablomuz olduğunu varsayalım.GuruAşağıda gösterildiği gibi, Tutorial_ID ve Tutorial_name olmak üzere iki sütun ve dört satırdan oluşan 99' numaralı tabloyu kullanacağız.GuruAşağıdaki örneklerde 99' tablosunu göreceksiniz.
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, ELSE içermeyen BASİT BİR DURUM'un yürütme akışını açıklamaktadır.
Sorgu 2: ELSE seçeneğiyle SIMPLE 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 diyagram, ELSE içeren SIMPLE CASE yapısının yürütme akışını açıklamaktadır.
CASE arandı
Arama yapılan durum için 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]
İşte:
- Boolean_Expression_1… parametresi, TRUE veya FALSE olarak değerlendirilecek ifadeyi belirtir.
- Statement_1, Statement_2… parametreleri, ilgili Boolean_Expression_1 veya Boolean_Expression_2 sonucunun TRUE olması durumunda yürütülecek ifadeleri belirtir.
- Özetle, koşul Boolean_Expression_1… şeklindedir ve eylem, yukarıdaki Boolean_Expression_1 DOĞRU ise Statement_N'nin yürütülmesidir.
- ALIAS_NAME isteğe bağlıdır ve CASE ifadesinin sonucuna verilen takma addır. Çoğunlukla CASE ifadesini SELECT yan tümcesinde kullandığımızda kullanılır.
Aranan Vaka Kuralları
- Basit Durumun aksine, Aramalı Durum yalnızca eşitlik kontrolüyle sınırlı değildir, aynı zamanda Boolean ifadelere de izin verir.
- Mantıksal ifade, ilk mantıksal ifadeden (yani Boolean_Expression_1) başlayarak sırayla değerlendirilir. Aşağıda uygulama yaklaşımı verilmiştir:
- Boolean_Expression_1 doğru ise, sonraki WHEN…THEN ifadeleri atlanır ve CASE yürütmesi hemen sona erer.
- Boolean_Expression_1 yanlış ise, Boolean_Expression_2 doğru olup olmadığı açısından değerlendirilir. Bu Boolean ifade değerlendirme süreci, Boolean ifadelerden biri doğru sonuç verene kadar devam eder.
- Eğer hiçbir eşleşme bulunmazsa, kontrol ELSE ifadesine geçer ve Statement_Else yürütülür.
- Basit Durumda olduğu gibi, Arama Yapılan Durumda da ELSE isteğe bağlıdır.
- Eğer ELSE ifadesi yoksa ve Boolean ifadelerinden hiçbiri TRUE döndürmüyorsa, NULL görüntülenir.
Aşağıdaki diyagram, aranan vakanın yürütme akışını göstermektedir:
Ö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, ELSE içermeyen ARANILAN DURUM'un yürütme akışını açıklamaktadır.
Sorgu 2: ELSE seçeneğiyle ARANILAN DURUM
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, ELSE yapısıyla birlikte ARANILAN DURUM'un yürütme akışını açıklamaktadır.
Yürütme Yaklaşımı Arasındaki Fark: BASİT ve ARAMA DURUMU
Aşağıdaki BASİT DURUM örneğine bir göz atalım:
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, 'Tutorial_name' SQL'deki CASE ifadesinin bir parçasıdır. Ardından, 'Tutorial_name' değeri her bir WHEN değeriyle, yani 'SQL' ile karşılaştırılır... ta ki 'Tutorial_name' bir WHEN değeriyle eşleşene kadar.
Aksine, SEARCH CASE örneğinde CASE ifadesi bulunmamaktadır:
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 WHEN ifadesinin kendi koşullu Boolean ifadesi vardır. Her Boolean ifadesi, yani Tutorial_name = 'SQL'…, TRUE/FALSE olarak değerlendirilir ve TRUE olarak değerlendirilen ilk Boolean ifadeye kadar bu işlem devam eder.
Basit ve Aramalı Durum Arasındaki Fark
| Basit Durum | Aranan Vaka |
| CASE anahtar kelimesinin hemen ardından CASE_İfadesi gelir ve WHEN ifadesinden önce yer alır.
Örneğin: |
CASE anahtar kelimesinin ardından WHEN ifadesi gelir ve CASE ile WHEN arasında herhangi bir ifade bulunmaz.
Örneğin: |
| Basit bir durumda, her WHEN ifadesi için bir DEĞER bulunur. Bu değerler (Değer_1, Değer_2…) sırayla tek bir CASE_İfadesi ile karşılaştırılır. Sonuç, her WHEN ifadesi için DOĞRU/YANLIŞ koşulu açısından değerlendirilir.
Örneğin: |
Arama yapılan bir durumda, her WHEN ifadesi için bir Boolean_Expression bulunur. Bu Boolean ifadeler (Boolean_Expression_1, Boolean_Expression_2…) her WHEN ifadesi için DOĞRU/YANLIŞ koşulunu değerlendirir.
Örneğin: |
| Basit bir durum yalnızca eşitlik kontrolünü destekler, yani CASE_Expression = VALUE_1, VALUE_2… olup olmadığını kontrol eder.
Örneğin: |
Boolean_Expression_N ile, Arama Yapılan Durum, Boolean değer üreten herhangi bir işlemi destekler. Buna eşittir ve eşit değildir operatörleri dahildir.
Örneğin: |
İç içe CASE: IF ELSE içindeki CASE
CASE yapısını IF…ELSE ifadesinin içinde kullanabiliriz. Bunu şu şekilde tanımlarız: değişken Uçak bileti için ve değerine göre şube işlemi yapılır. Aşağıda örnek bir MS-SQL kodu bulunmaktadır:
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 ifadesi IF…ELSE ifadesinin içine yerleştirilmiştir. Önce IF ifadesi çalışır ve SQL Server'daki CASE koşulu yanlışsa, ELSE ifadesi çalışır. ELSE kısmı, SQL'de iç içe bir CASE ifadesi içerir. Uçak bileti değerine bağlı olarak, aşağıdaki sonuçlardan biri görüntülenir:
- Uçak biletlerinin fiyatı 400 dolardan yüksekse sistem 'Yakındaki Turistik Yeri Ziyaret Edin' çıktısını verir.
- Sistem, uçak biletlerinin fiyatı 0 ile 100 dolar arasındaysa 'Los Angeles'ı Ziyaret Edin' yazdırır.
- Sistem, uçak biletlerinin fiyatı 101 ile 200 dolar arasındaysa 'New York'u Ziyaret Edin' yazdırır.
- Sistem, uçak biletlerinin fiyatı 201 $ ile 400 $ arasındaysa 'Avrupa'yı Ziyaret Edin' yazdırır.
Aşağıdaki sonuç, ELSE dalı içinde iç içe CASE ifadesi çalıştırıldığında döndürülen konumu göstermektedir:
Yuvalanmış CASE: CASE içindeki CASE
SQL'de CASE yapısını bir CASE yapısının içinde başka bir CASE yapısı kullanabiliriz. Aşağıda MS-SQL kod örneği 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, bir CASE ifadesi başka bir CASE ifadesinin içine yerleştirilmiştir. Sistem önce dıştaki CASE ifadesini çalıştırır; eğer Flight_Ticket < $400 ise, içteki CASE ifadesi çalışır. Döndürülen konum, önceki örnektekiyle aynı bilet aralıklarını izler, bu nedenle 250 dolarlık bir bilet 201-400 dolar aralığına girer ve 'Avrupa'yı Ziyaret Edin' sonucunu döndürür.
Aşağıdaki sonuç, 250 dolarlık bir bilet için iç CASE fonksiyonunun döndürdüğü konumu göstermektedir:
GÜNCELLEMELİ VAKA
Yine varsayalım ki elimizde 'GuruAşağıda gösterildiği gibi, iki sütun ve dört satırdan oluşan 99'luk tablo:
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 ifadesinde CASE kullanılmıştır. Tutorial_Name değerine bağlı olarak, Tutorial_Name sütunu THEN ifadesinin değeriyle güncellenir:
- Eğer Tutorial_Name = 'SQL' ise, Tutorial_Name'i 'Yapılandırılmış Sorgu Dili' olarak güncelleyin.
- Eğer Tutorial_Name = 'PL/SQL' ise, Tutorial_Name'i 'PL/SQL' olarak güncelleyin.Oracle PL/SQL'.
- Eğer Tutorial_Name = 'MSSQL' ise, Tutorial_Name'i ' olarak güncelleyin.Microsoft SQL'.
- Eğer Tutorial_Name = 'Hadoop' ise, Tutorial_Name'i 'Apache Hadoop' olarak güncelleyin.
Bu komutu çalıştırmak, aşağıdaki gibi eşleşen satırları günceller:
'GuruGüncellenen değerleri kontrol etmek için 99' tablosuna bakın:
VAKA ile Sipariş:
CASE ifadesini ORDER BY ile birlikte kullanabiliriz. Aşağıda MS-SQL kod örneği 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ıyor. @Order 1 olarak ayarlanıyor ve ilk WHEN Boolean ifadesi TRUE olarak değerlendirildiği için ORDER BY koşulu için Tutorial_ID seçiliyor. Sonuç aşağıda gösterilmiştir:
İlginç gerçekler!
- CASE yapısı, başka bir CASE yapısının içine veya IF…ELSE ifadesinin içine yerleştirilebilir.
- CASE ifadesi, SELECT'e ek olarak UPDATE ve ORDER BY gibi diğer SQL ifadeleriyle de kullanılabilir.













