ORDER BY CASE๋Š” SQL Query์—์„œ ๋ณต์žกํ•œ ์ •๋ ฌ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ์ด๋‹ค. ๋งˆ์น˜ ๋„์„œ๊ด€์—์„œ ์ฑ…์„ 1) ๋Œ€์ถœ ๋นˆ๋„ 2) ์ถœํŒ์ผ์ž 3) ์ €์ž ์ด๋ฆ„ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ์—ฌ๋Ÿฌ ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์šฐ์„ ์ˆœ์œ„ ๊ธฐ๋ฐ˜ ์ •๋ ฌ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ๋ณธ ๋™์ž‘ ๋ฐฉ์‹

flowchart TB
    A[SQL Query ์‹คํ–‰] --> B[CASE ์กฐ๊ฑด ํ‰๊ฐ€]
    B --> C[์ •๋ ฌ ์šฐ์„ ์ˆœ์œ„ ํ• ๋‹น]
    C --> D[๋ฐ์ดํ„ฐ ์ •๋ ฌ]
    D --> E[๊ฒฐ๊ณผ ๋ฐ˜ํ™˜]
    
    subgraph "CASE ์กฐ๊ฑด ํ‰๊ฐ€"
        B1[์กฐ๊ฑด1 ๊ฒ€์‚ฌ] --> B2[์กฐ๊ฑด2 ๊ฒ€์‚ฌ]
        B2 --> B3[์กฐ๊ฑดN ๊ฒ€์‚ฌ]
    end

๊ตฌํ˜„

-- ์˜ˆ์ œ๋ฅผ ์œ„ํ•œ ํ…Œ์ด๋ธ” ์ƒ์„ฑ
CREATE TABLE orders (
    id INT PRIMARY KEY,
    status VARCHAR(20),
    priority INT,
    created_at TIMESTAMP
);
 
-- ์ธ๋ฑ์Šค ์ƒ์„ฑ (์„ฑ๋Šฅ ์ตœ์ ํ™”)
CREATE INDEX idx_status_priority ON orders(status, priority);

๋‹จ๊ณ„๋ณ„ ๊ตฌํ˜„

1. ๊ธฐ๋ณธ ๊ตฌํ˜„

-- ๊ธฐ๋ณธ์ ์ธ ORDER BY CASE ๊ตฌํ˜„
-- ์ฃผ๋ฌธ ์ƒํƒœ์— ๋”ฐ๋ฅธ ์šฐ์„ ์ˆœ์œ„ ์ •๋ ฌ
SELECT 
    id,
    status,
    priority
FROM orders
ORDER BY
    CASE status
        WHEN 'URGENT' THEN 1    -- ๊ธด๊ธ‰ ์ฃผ๋ฌธ ์ตœ์šฐ์„ 
        WHEN 'PENDING' THEN 2   -- ๋Œ€๊ธฐ ์ฃผ๋ฌธ ๋‹ค์Œ
        WHEN 'PROCESSING' THEN 3 -- ์ฒ˜๋ฆฌ์ค‘ ์ฃผ๋ฌธ
        ELSE 4                  -- ๊ธฐํƒ€ ์ƒํƒœ
    END;

2. ๋ณตํ•ฉ ์กฐ๊ฑด ๊ตฌํ˜„

-- ์ƒํƒœ์™€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฒฐํ•ฉํ•œ ์ •๋ ฌ
SELECT 
    id,
    status,
    priority,
    created_at
FROM orders
ORDER BY
    CASE 
        WHEN status = 'URGENT' AND priority > 5 THEN 1
        WHEN status = 'URGENT' THEN 2
        WHEN status = 'PENDING' AND priority > 5 THEN 3
        WHEN status = 'PENDING' THEN 4
        ELSE 5
    END,
    created_at DESC;  -- ๋™์ผ ์šฐ์„ ์ˆœ์œ„ ๋‚ด์—์„œ๋Š” ์ตœ์‹  ์ˆœ

Best Practices

์„ฑ๋Šฅ ์ตœ์ ํ™”

-- ์ž˜๋ชป๋œ ์˜ˆ์‹œ: ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํฌํ•จํ•œ CASE
SELECT *
FROM orders
ORDER BY
    CASE 
        WHEN DATEDIFF(NOW(), created_at) > 30 THEN 1
        ELSE 2
    END;
 
-- ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์‹œ: ๊ณ„์‚ฐ์„ ๋ฏธ๋ฆฌ ์ˆ˜ํ–‰
WITH order_ages AS (
    SELECT 
        *,
        DATEDIFF(NOW(), created_at) as age_days
    FROM orders
)
SELECT *
FROM order_ages
ORDER BY
    CASE 
        WHEN age_days > 30 THEN 1
        ELSE 2
    END;

์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜

graph TD
    A[Query Parser] --> B[Execution Plan Generator]
    B --> C[CASE Expression Evaluator]
    C --> D[Sort Operation]
    D --> E[Result Set]
    
    subgraph "Sort Operation"
        D1[์ž„์‹œ ์ •๋ ฌ ํ‚ค ์ƒ์„ฑ]
        D2[๋ฉ”๋ชจ๋ฆฌ ์ •๋ ฌ]
        D3[๋””์Šคํฌ ์ •๋ ฌ]
    end

์„ฑ๋Šฅ ๊ณ ๋ ค์‚ฌํ•ญ

  1. ์ธ๋ฑ์Šค ํ™œ์šฉ

    • CASE ๋ฌธ ๋‚ด๋ถ€ ์กฐ๊ฑด์ด ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ•œ๋‹ค
    • ๋ณตํ•ฉ ์ธ๋ฑ์Šค ์ƒ์„ฑ ์‹œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ •๋ ฌ ์กฐ๊ฑด์„ ์šฐ์„ ํ•œ๋‹ค
  2. ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ

    • ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ •๋ ฌ ์‹œ ์ž„์‹œ ํ…Œ์ด๋ธ” ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•œ๋‹ค
    • ORDER BY ์ ˆ์˜ ๋ณต์žก๋„๊ฐ€ ๋†’์„์ˆ˜๋ก ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ฆ๊ฐ€ํ•œ๋‹ค