DBAtlas · Atlas de operaciones de bases de datos

Expresión CASE (valor condicional)

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 asigna a una expresión distintos valores según condiciones; tiene una forma simple (CASE my_column WHEN value) y una forma de búsqueda (CASE WHEN condition). DECODE de Oracle hace algo similar, pero solo compara por igualdad y trata los NULL como iguales; para la portabilidad, prefiera CASE.

PostgreSQL

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

PostgreSQL admite plenamente la expresión CASE estándar, que puede usarse en cualquier lugar donde se produzca un valor (SELECT, WHERE, ORDER BY, GROUP BY). No tiene DECODE al estilo de Oracle; use CASE en su lugar, o COALESCE/NULLIF para condiciones cortas.

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 admiten la expresión CASE estándar; también existe la función IF(condition, if_true, if_false) para una condición rápida de dos ramas (similar a IIF de SQL Server). CASE se puede usar en cualquier contexto de expresión.

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 admite el CASE estándar; desde 2012 existen el atajo IIF() para condiciones de dos ramas y CHOOSE() para múltiples coincidencias. IIF se traduce realmente a CASE. CASE también se puede usar en ORDER BY y en computed columns.

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" } } } }
])

En la agregación de MongoDB, los equivalentes de CASE son los operadores $switch (varias ramas) y $cond (if-then-else de tres argumentos). Se usan dentro de $project o $addFields para crear campos derivados condicionales.

Redis

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

Redis no tiene una expresión de consulta como CASE. La lógica condicional se escribe en el código de la aplicación o en un script Lua en el servidor (EVAL). Dentro de FT.AGGREGATE de RediSearch es posible una evaluación limitada de expresiones con APPLY.

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"]
}

En Elasticsearch, la lógica CASE dentro de la consulta se escribe como un script Painless (runtime field, script_fields o scripted metric). El flujo if/else se define en el lenguaje Painless. La agregación 'range' también puede generar buckets tipo CASE para categorizar.

Abrir en DBAtlas →