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)。Oracle 的 DECODE 作用类似,但只做相等比较,且将 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)。它没有 Oracle 风格的 DECODE;请改用 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) 函数(类似 SQL Server 的 IIF)。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)中。在 RediSearch FT.AGGREGATE 中可通过 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"]
}

在 Elasticsearch 中,查询内的 CASE 逻辑以 Painless 脚本编写(runtime field、script_fields 或 scripted metric)。if/else 流程用 Painless 语言定义。'range' 聚合也可以生成类似 CASE 的分类桶。

在 DBAtlas 中打开 →