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와 computed column에서도 사용할 수 있다.

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 aggregation에서 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' aggregation도 분류를 위한 CASE와 유사한 버킷을 생성할 수 있다.

DBAtlas에서 열기 →