DBAtlas · Atlas de operações de banco de dados

Expressão 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 mapeia uma expressão para valores diferentes conforme as condições; tem uma forma simples (CASE my_column WHEN value) e uma forma pesquisada (CASE WHEN condition). O DECODE do Oracle faz algo semelhante, mas compara apenas por igualdade e trata NULLs como iguais; prefira CASE pela portabilidade.

PostgreSQL

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

O PostgreSQL suporta totalmente a expressão CASE padrão, utilizável em qualquer lugar que produza um valor (SELECT, WHERE, ORDER BY, GROUP BY). Não tem DECODE no estilo Oracle; use CASE ou, para condições curtas, 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;

O MySQL/MariaDB suportam a expressão CASE padrão; há também a função IF(condition, if_true, if_false) para uma condição rápida de dois ramos (semelhante ao IIF do SQL Server). CASE pode ser usado em qualquer contexto de expressão.

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;

O SQL Server suporta o CASE padrão; desde 2012 existem o atalho IIF() para condições de dois ramos e CHOOSE() para múltiplas correspondências. Na verdade, o IIF é traduzido para CASE. CASE também pode ser usado em ORDER BY e em 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" } } } }
])

Na agregação do MongoDB, os equivalentes ao CASE são os operadores $switch (vários ramos) e $cond (if-then-else com três argumentos). São usados dentro de $project ou $addFields para criar campos derivados condicionais.

Redis

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

O Redis não tem uma expressão de consulta como CASE. A lógica condicional é escrita no código da aplicação ou em um script Lua no lado do servidor (EVAL). É possível uma avaliação limitada de expressões com APPLY dentro do FT.AGGREGATE do RediSearch.

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

No Elasticsearch, a lógica CASE dentro da consulta é escrita como um script Painless (runtime field, script_fields ou scripted metric). O fluxo if/else é definido na linguagem Painless. A agregação 'range' também pode gerar buckets semelhantes a CASE para categorização.

Abrir no DBAtlas →