DBAtlas · Veritabanı operasyon atlası

CASE ifadesi (koşullu değer)

Oracle

-- Aranan (searched) CASE
SELECT ad,
  CASE WHEN maas >= 20000 THEN 'yuksek'
       WHEN maas >= 10000 THEN 'orta'
       ELSE 'dusuk' END AS kademe
FROM calisan;

-- Oracle'a özel kısa yol: DECODE (eşitlik karşılaştırması)
SELECT ad, DECODE(durum, 'A', 'Aktif', 'P', 'Pasif', 'Bilinmiyor') FROM calisan;

CASE bir ifadeyi koşullara göre farklı değerlere çevirir; hem basit (CASE sutun WHEN deger) hem aranan (CASE WHEN kosul) biçimi vardır. Oracle'a özgü DECODE benzer iş yapar ama yalnız eşitlik karşılaştırır ve NULL'ı eşit sayar; taşınabilirlik için CASE tercih edilir.

PostgreSQL

SELECT ad,
  CASE WHEN maas >= 20000 THEN 'yuksek'
       WHEN maas >= 10000 THEN 'orta'
       ELSE 'dusuk' END AS kademe
FROM calisan;

PostgreSQL standart CASE ifadesini tam destekler ve bir değer üreten her yerde (SELECT, WHERE, ORDER BY, GROUP BY) kullanılabilir. Oracle'ın DECODE'u yoktur; onun yerine CASE veya kısa koşullar için COALESCE/NULLIF kullanılır.

MySQL

SELECT ad,
  CASE WHEN maas >= 20000 THEN 'yuksek'
       WHEN maas >= 10000 THEN 'orta'
       ELSE 'dusuk' END AS kademe
FROM calisan;

-- Kısa koşul için IF():
SELECT ad, IF(aktif = 1, 'Evet', 'Hayir') FROM calisan;

MySQL/MariaDB standart CASE ifadesini destekler; ayrıca iki dallı hızlı koşul için IF(kosul, dogru, yanlis) fonksiyonu vardır (SQL Server'ın IIF'ine benzer). CASE her ifade bağlamında kullanılabilir.

SQL Server

SELECT ad,
  CASE WHEN maas >= 20000 THEN 'yuksek'
       WHEN maas >= 10000 THEN 'orta'
       ELSE 'dusuk' END AS kademe
FROM calisan;

-- Kısa yol: IIF() (2012+)
SELECT ad, IIF(aktif = 1, 'Evet', 'Hayir') FROM calisan;

SQL Server standart CASE'i destekler; 2012'den beri iki dallı koşul için IIF() ve çoklu eşleşme için CHOOSE() kısa yolları vardır. IIF aslında CASE'e çevrilir. CASE ORDER BY ve hesaplanan sütunlarda da kullanılabilir.

MongoDB

// En yakın karşılık: $switch veya $cond
db.calisan.aggregate([
  { $project: { ad: 1, kademe: {
      $switch: { branches: [
        { case: { $gte: ["$maas", 20000] }, then: "yuksek" },
        { case: { $gte: ["$maas", 10000] }, then: "orta" } ],
        default: "dusuk" } } } }
])

MongoDB aggregation'da CASE karşılığı $switch (çok dallı) ve $cond (üç argümanlı if-then-else) operatörleridir. $project veya $addFields içinde koşullu türetilmiş alanlar oluşturmak için kullanılır.

Redis

# Uygulanamaz: Redis'te sorgu içi koşul ifadesi yoktur.

Redis'te CASE gibi bir sorgu ifadesi yoktur. Koşullu mantık uygulama kodunda veya sunucu tarafı Lua script (EVAL) içinde yazılır. RediSearch FT.AGGREGATE içinde APPLY ile sınırlı ifade değerlendirmesi mümkündür.

Elasticsearch

# En yakın karşılık: runtime field veya script içinde koşul
GET calisan/_search
{
  "runtime_mappings": { "kademe": { "type": "keyword",
    "script": "if (doc['maas'].value >= 20000) emit('yuksek'); else if (doc['maas'].value >= 10000) emit('orta'); else emit('dusuk');" } },
  "fields": ["kademe"]
}

Elasticsearch'te sorgu içi CASE mantığı Painless script'iyle (runtime field, script_fields veya scripted metric) yazılır. if/else akışı Painless dilinde tanımlanır. Kategorilere ayırma için 'range' agregasyonu da CASE benzeri bucket'lar üretebilir.

DBAtlas'ta aç →