DBAtlas · Atlas für Datenbankbetrieb

CASE-Ausdruck (bedingter Wert)

Oracle

-- Searched CASE
SELECT name,
  CASE WHEN salary >= 20000 THEN 'high'
       WHEN salary >= 10000 THEN 'medium'
       ELSE 'low' END AS tier
FROM employee;

-- Oracle-specific shortcut: DECODE (equality comparison)
SELECT name, DECODE(status, 'A', 'Active', 'P', 'Passive', 'Unknown') FROM employee;

CASE bildet einen Ausdruck je nach Bedingung auf verschiedene Werte ab; es gibt eine einfache Form (CASE my_column WHEN value) und eine Suchform (CASE WHEN condition). Oracles DECODE erfüllt eine ähnliche Aufgabe, vergleicht aber nur auf Gleichheit und behandelt NULLs als gleich; für Portabilität CASE bevorzugen.

PostgreSQL

SELECT name,
  CASE WHEN salary >= 20000 THEN 'high'
       WHEN salary >= 10000 THEN 'medium'
       ELSE 'low' END AS tier
FROM employee;

PostgreSQL unterstützt den Standard-CASE-Ausdruck vollständig, überall dort, wo ein Wert entsteht (SELECT, WHERE, ORDER BY, GROUP BY). Ein DECODE im Oracle-Stil gibt es nicht; nutze stattdessen CASE oder für kurze Bedingungen COALESCE/NULLIF.

MySQL

SELECT name,
  CASE WHEN salary >= 20000 THEN 'high'
       WHEN salary >= 10000 THEN 'medium'
       ELSE 'low' END AS tier
FROM employee;

-- IF() for a short condition:
SELECT name, IF(active = 1, 'Yes', 'No') FROM employee;

MySQL/MariaDB unterstützen den Standard-CASE-Ausdruck; für eine schnelle zweiwertige Bedingung gibt es zusätzlich die Funktion IF(condition, if_true, if_false) (ähnlich IIF in SQL Server). CASE ist in jedem Ausdruckskontext verwendbar.

SQL Server

SELECT name,
  CASE WHEN salary >= 20000 THEN 'high'
       WHEN salary >= 10000 THEN 'medium'
       ELSE 'low' END AS tier
FROM employee;

-- Shortcut: IIF() (2012+)
SELECT name, IIF(active = 1, 'Yes', 'No') FROM employee;

SQL Server unterstützt Standard-CASE; seit 2012 gibt es die Kurzform IIF() für zweiwertige Bedingungen und CHOOSE() für mehrere Treffer. IIF wird intern in CASE übersetzt. CASE lässt sich auch in ORDER BY und berechneten Spalten verwenden.

MongoDB

// Closest equivalent: $switch or $cond
db.employee.aggregate([
  { $project: { name: 1, tier: {
      $switch: { branches: [
        { case: { $gte: ["$salary", 20000] }, then: "high" },
        { case: { $gte: ["$salary", 10000] }, then: "medium" } ],
        default: "low" } } } }
])

In der MongoDB-Aggregation entsprechen die Operatoren $switch (mehrere Zweige) und $cond (if-then-else mit drei Argumenten) dem CASE. Sie werden in $project oder $addFields genutzt, um bedingte abgeleitete Felder zu erzeugen.

Redis

# Not applicable: Redis has no in-query conditional expression.

Redis hat keinen Abfrageausdruck wie CASE. Bedingte Logik wird im Anwendungscode oder in einem serverseitigen Lua-Skript (EVAL) geschrieben. Eingeschränkte Ausdrucksauswertung ist mit APPLY in RediSearch FT.AGGREGATE möglich.

Elasticsearch

# Closest equivalent: a condition inside a runtime field or script
GET employee/_search
{
  "runtime_mappings": { "tier": { "type": "keyword",
    "script": "if (doc['salary'].value >= 20000) emit('high'); else if (doc['salary'].value >= 10000) emit('medium'); else emit('low');" } },
  "fields": ["tier"]
}

In Elasticsearch wird CASE-Logik innerhalb einer Abfrage als Painless-Skript geschrieben (Runtime Field, script_fields oder Scripted Metric). Der if/else-Ablauf wird in der Sprache Painless definiert. Auch die Aggregation 'range' kann CASE-ähnliche Buckets zur Kategorisierung erzeugen.

In DBAtlas öffnen →