Menu

SQLite CASE Kullanımı: WHEN, THEN, ELSE ve IIF

SQLite'ta CASE nasıl çalışır? Basit ve aranan (searched) form, SELECT, ORDER BY ve WHERE içinde kullanım, ayrıca IIF ne zaman daha mantıklı — hepsi örneklerle.

Bu sayfada çalıştırılabilir editörler var — düzenle, çalıştır ve sonucu anında gör.

CASE, SQL'in If/Else'idir

CASE, sorgunun içine koşullu mantık eklemenin yoludur. Yazdığınız WHEN dallarını sırayla denetler, eşleşen ilk koşulu bulduğunda THEN sonrasındaki değeri döndürür. Hiçbiri tutmazsa ELSE değerine düşer; onu da yazmadıysan sonuç NULL olur.

Burada önemli olan kelime ifade. CASE bir değer üretir, dolayısıyla bir değerin geçerli olduğu her yerde kullanabilirsiniz: SELECT içindeki bir sütun, ORDER BY anahtarı, bir karşılaştırmanın sağ tarafı veya bir fonksiyona verilen argüman.

Yapı tam olarak bu kadar: CASE, ardından bir veya birden fazla WHEN ... THEN ..., isteğe bağlı bir ELSE ve sonunda END. END zorunludur — en sık yapılan yazım hatası onu unutmaktır.

Gerçekçi Bir Örnek

Diyelim ki bir orders tablonuz var ve her satırı boyutuna göre etiketlemek istiyorsunuz. Sorguyu çalıştırabilmeniz için tabloyu satır içinde küçük bir şekilde oluşturalım:

Dallar yukarıdan aşağıya doğru kontrol edilir. İlk eşleşen kazanır, bu yüzden en özelden en genele doğru sıralayın. ELSE ise hiçbir koşula uymayan her şeyi yakalar — bunu yazmazsanız, 1200.00 değeri 'büyük' yerine NULL olarak döner.

Searched vs Simple form karşılaştırması

Yukarıda gördüğünüz kullanım searched formdur: her WHEN kendi boolean koşuluna sahiptir. Tek bir ifadeyi birkaç sabit değerle karşılaştırdığınızda ise daha kısa bir biçim var — simple form:

CASE ifadesinden sonra yazdığınız değer bir kez hesaplanır ve her WHEN değeriyle = operatörü kullanılarak karşılaştırılır. Tek bir kolonda eşitlik kontrolü yaparken bu form çok daha temiz duruyor.

Ama dikkat edilmesi gereken bir nokta var: simple CASE = operatörünü kullanır ve SQL'de NULL = NULL doğru değildir. Yani status kolonu NULL olabiliyorsa, 'A'/'B'/'C' dallarının hiçbirine takılmaz; doğrudan ELSE'e düşer. NULL durumunu ayrıca yakalamak istiyorsanız searched forma geçip WHEN status IS NULL THEN ... yazmalısınız.

ORDER BY içinde CASE kullanımı

ORDER BY herhangi bir ifade alabildiği için CASE burada da rahatça çalışır. Alfabetik ya da sayısal sıralamaya uymayan, kendine özel bir sıralama düzeni istediğinde işine yarar:

'high' < 'low' < 'medium' alfabetik olarak böyle sıralanır ki triyaj açısından bir işe yaramaz. Her önceliği CASE ile bir sayıya eşlediğinizde gerçekten istediğiniz sıralamaya kavuşursunuz. Sondaki , id ise eşitlik durumlarında stabil bir sıralama sağlar.

WHERE içinde CASE kullanımı

CASE ifadesini WHERE içinde de kullanabilirsiniz; ama çoğu durumda buna gerek kalmaz — zincirlenmiş AND/OR çok daha okunaklıdır. CASE'in asıl parladığı yer, koşulun kendisinin başka bir değere bağlı olduğu durumlardır:

İndirimli ürünler 20'nin, normal ürünler ise 30'un altındaysa kriteri sağlıyor. Yani eşik değerin kendisi koşula bağlı. CASE olmadan bunu (on_sale = 1 AND price < 20) OR (on_sale = 0 AND price < 30) şeklinde yazmak zorunda kalırdınız — sonuç aynı, ama gereksiz gürültü çıkar.

Aggregate Fonksiyonları İçinde CASE Kullanımı

CASE asıl gücünü burada gösteriyor. SUM ya da COUNT ile birleştirdiğinizde, satırların yalnızca belirli bir alt kümesi üzerinde tek seferde toplam alabilirsiniz — "bunlardan kaç tanesi şu koşulu sağlıyor" sorusunun SQL'deki karşılığı:

CASE ifadesi eşleşen satırlar için 1, diğerleri için 0 döndürdüğü için SUM aslında koşullu bir sayım haline geliyor. Aynı numara gelir hesabı için de geçerli: eşleşen satırlarda total, diğerlerinde 0 döndür yeterli. Tablo bir kez taranıyor, birden fazla koşullu toplam tek seferde hesaplanıyor.

IIF: İki Dallı Kısayol

Tek bir koşulun iki olası sonucu olduğunda, SQLite size IIF(cond, when_true, when_false) fonksiyonunu sunar. Bu, CASE WHEN cond THEN when_true ELSE when_false END ifadesinin kısaltılmış halinden başka bir şey değildir:

IIF fonksiyonunu mantık ikili olduğunda ve tek satırda daha okunaklı durduğunda kullanın. Üç veya daha fazla dal varsa, NULL durumunu ayrıca ele almanız gerekiyorsa ya da birden fazla WHEN ifadesinin sırayla değerlendirilmesini istiyorsanız CASE yapısına geçin.

Dikkat Edilmesi Gereken Tuzaklar

İnsanları en çok yakalayan birkaç nokta:

  • END yazmayı unutmak. CASE bir blok açar; END ise onu kapatır. SQLite, gerçek hatanın çok sonrasında bir parse hatası fırlatır ve kafa karıştırır.
  • ELSE yoksa sonuç NULL olur. Hiçbir WHEN dalı eşleşmezse ve ELSE yazmadıysanız sonuç NULL döner. Bazen istediğiniz tam da budur ama çoğu zaman değildir.
  • Dalların sırası önemlidir. Searched (aranan) formda, eşleşen ilk WHEN kazanır. WHEN total < 500 ifadesini WHEN total < 100 ifadesinden önce koyarsanız, ikinci dala asla ulaşılmaz.
  • Tip karışıklığı. Her dal farklı bir tip döndürebilir ve SQLite buna ses çıkarmaz — ama sonradan veriyi tüketen kodunuz çıkarabilir. Tüm dalların uyumlu tipler döndürmesine özen gösterin (hepsi metin ya da hepsi sayısal gibi).
  • Simple CASE ve NULL. Yukarıda da belirtildiği gibi: simple form = ile karşılaştırma yapar ve bu da NULL ile asla eşleşmez. Null değerler işin içindeyse searched formu tercih edin.

Sırada: String Fonksiyonları

CASE, değerlere göre dallanmanızı sağlıyor; bir sonraki bölüm ise değerleri dönüştürme konusuna giriyor. String fonksiyonları — UPPER, LOWER, SUBSTR, REPLACE ve LIKE kalıpları — metin kolonlarını temizleme ve yeniden biçimlendirme gibi günlük işlerin tam göbeğinde. Sırada bunlar var.

Sıkça Sorulan Sorular

SQLite'ta CASE ifadesi nedir?

CASE ifadesi, SQL'in if/else karşılığıdır — koşulları değerlendirir ve bir değer döndürür. Bir statement değil, expression olduğu için bir değerin geçerli olduğu her yerde kullanabilirsiniz: SELECT, WHERE, ORDER BY, UPDATE ve hatta agregat fonksiyonların içinde. Her dal WHEN koşul THEN değer biçiminde yazılır, sonuna isteğe bağlı bir ELSE eklenir.

SQLite'ta basit CASE ile aranan (searched) CASE arasındaki fark nedir?

Basit CASE, tek bir ifadeyi birden çok değerle karşılaştırır: CASE status WHEN 'A' THEN ... WHEN 'B' THEN ... END. Aranan CASE ise her dal için ayrı bir boolean koşul değerlendirir: CASE WHEN price > 100 THEN ... WHEN qty = 0 THEN ... END. Aranan form çok daha esnektir — farklı sütunları, operatörleri ve NULL kontrollerini rahatça bir arada kullanabilirsiniz.

SQLite'ta CASE yerine IIF ne zaman tercih edilmeli?

IIF(cond, a, b), aslında CASE WHEN cond THEN a ELSE b END ifadesinin kısa yazımıdır. İki dallı basit mantıklarda IIF daha temiz okunur. Üç ve daha fazla dalınız varsa, sıralı bir fall-through mantığı istiyorsanız ya da WHEN col IS NULL ile NULL durumunu açıkça ele almanız gerekiyorsa CASE kullanın.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA