DBAtlas · Атлас эксплуатации баз данных

Выражение CASE (условное значение)

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 сопоставляет выражению разные значения в зависимости от условий; есть простая форма (CASE my_column WHEN value) и поисковая (CASE WHEN condition). DECODE в Oracle выполняет похожую задачу, но сравнивает только на равенство и считает NULL равными; для переносимости предпочтителен CASE.

PostgreSQL

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

PostgreSQL полностью поддерживает стандартное выражение CASE, которое можно использовать везде, где вычисляется значение (SELECT, WHERE, ORDER BY, GROUP BY). DECODE в стиле Oracle нет; используйте CASE или 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 поддерживают стандартное выражение CASE; есть также функция IF(condition, if_true, if_false) для быстрого условия с двумя ветвями (похоже на IIF в SQL Server). CASE можно использовать в любом контексте выражений.

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 поддерживает стандартный CASE; с 2012 есть сокращение IIF() для условий с двумя ветвями и CHOOSE() для множественного выбора. IIF фактически транслируется в CASE. CASE можно использовать также в ORDER BY и вычисляемых столбцах.

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

В агрегации MongoDB эквиваленты CASE — операторы $switch (многоветвевой) и $cond (if-then-else с тремя аргументами). Они используются внутри $project или $addFields для создания условных производных полей.

Redis

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

В Redis нет выражения запросов вроде CASE. Условная логика пишется в коде приложения или в серверном Lua-скрипте (EVAL). Ограниченное вычисление выражений возможно через APPLY внутри FT.AGGREGATE в 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"]
}

В Elasticsearch логика CASE внутри запроса пишется скриптом Painless (runtime field, script_fields или scripted metric). Поток if/else задаётся на языке Painless. Агрегация 'range' тоже может формировать CASE-подобные бакеты для категоризации.

Открыть в DBAtlas →