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.

  1. Basit VAKA
  2. 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.

Basit Vaka Bildiriminin Çalışması
Basit Vaka Bildiriminin Çalışması

Ö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:

SQL Server'da Basit Durum

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.

SQL Server'da Basit Durum

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.

SQL Server'da Basit Durum

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.

Aranan Vaka Bildiriminin Çalışması

Aranan Vaka Bildiriminin Çalışması

Ö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.

SQL Server'da CASE örneği arandı

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.

SQL Server'da CASE arandı

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:
DAVA
NE ZAMAN Değer_1 THEN İfade_1…

Case anahtar sözcüğünden sonra WHEN ifadesi gelir ve CASE ile WHEN arasında herhangi bir ifade yoktur.

Örneğin:
DURUM NE ZAMAN SONRA Açıklama_1…

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:
DAVA
NE ZAMAN Değer_1 THEN İfade_1…
NE ZAMAN Değer_2 THEN İfade_2…

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:
OLGU
NE ZAMAN SONRA Açıklama_1…
NE ZAMAN SONRA Açıklama_2…

Basit Durum yalnızca eşitlik kontrolünü destekler. Yani CASE_Expression = VALUE_1, VALUE_2…

Örneğin:
DAVA WHEN Değer_1 THEN İfade_1…Yukarıdaki örnekte, sistem tarafından gerçekleştirilen tek işlem Case_Expression = Value_1 olup olmadığının kontrol edilmesidir.

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:
DURUM NE ZAMAN THEN İfade_1… Yukarıdaki örnekte Boolean_Expression_1, A = B, A != B gibi hem 'eşittir' hem de 'eşit değildir' operatörünü içerebilir.

İç 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.

SQL Server'da iç içe CASE

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.

SQL Server'da iç içe CASE örneği

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:

SQL Server'da GÜNCELLEME içeren VAKA

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

SQL Server'da GÜNCELLEME içeren VAKA

Güncellenen değeri kontrol etmek için Guru99 tablosunu sorgulayalım:

SQL Server'da GÜNCELLEME içeren VAKA

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

SQL Server'da Order by ile CASE

İ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.