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 式をサポートする。手早い 2 分岐の条件には 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 以降は 2 分岐の条件のための 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(3 引数の 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 で開く →