Hi, 大家好~~
繼昨天練習一下GROUP BY
後,今天想練習SQL WHERE
clause 加CASE WHEN
的query,那讓我們開始吧!
我們先看看PostgreSQL: Documentation 的說明:
CASE WHEN condition THEN result
[WHEN ...]
[ELSE result]
END
我們可看到CASE WHEN 的架構跟Ruby 有點像,但WHEN 的判斷後要加上THEN
表示結果
先試試利用posts 資料表,搭配WHERE 和CASE WHEN 的基本語句,但讓我們先來假定一個情境:
情境1:以userId 來當主要判斷的欄位,當userId 為2 時
SELECT * FROM posts
WHERE
CASE "userId"
WHEN 2 THEN "userId" = 2
END
接著我想指定若是
情境2:以userId 來當主要判斷的欄位,當(userId 為1 或2)時則顯示其相對資料
SELECT * FROM posts
WHERE
CASE "userId"
WHEN (1, 2) THEN "userId" IN (1, 2)
END
但這麼寫會出現錯誤:
Query 1 ERROR: ERROR: operator does not exist: integer = record
LINE 4: WHEN (1, 2) THEN "userId" IN (1, 2)
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
所以稍微調整寫法,並採用了::
來表示轉換/宣告型別:
SELECT * FROM posts
WHERE
CASE
WHEN "userId"::int IN (1, 2)
THEN "userId" IN (1, 2)
END
如此得到的結果為:
那我們能不能增加多個WHEN 的判斷呢?
情境3:以userId 來當主要判斷的欄位,當(userId 為1 或2)、(userId 為3 或4)時則顯示其相對資料:
SELECT * FROM posts
WHERE
CASE
WHEN "userId"::int IN (1, 2) THEN "userId" IN (1, 2)
WHEN "userId"::int IN (3, 4) THEN "userId" IN (3, 4)
END
-- 成功!
情境4:當(userId 為1 或2 且id 大於等於15)、(userId 為3 或4 且id 小於等於25)時則顯示其相對資料:
SELECT * FROM posts
WHERE
CASE
WHEN "userId"::int IN (1, 2) AND id >= 15 THEN "userId" IN (1, 2)
WHEN "userId"::int IN (3, 4) AND id <= 25 THEN "userId" IN (3, 4)
END
最後我們來試著加上ELSE
,
情境5:當(userId 為1 或2 且id 大於等於15)、(userId 為3 或4 且id 小於等於25)時則顯示其相對資料,否則顯示(userId 為9、10 且id 大於99 的):
SELECT * FROM posts
WHERE
CASE
WHEN "userId"::int IN (1, 2) AND id >= 15 THEN "userId" IN (1, 2)
WHEN "userId"::int IN (3, 4) AND id <= 25 THEN "userId" IN (3, 4)
ELSE ("userId" IN (9, 10) AND id > 99)
END
以上,是SQL WHERE clause 搭配CASE WHEN 的用法簡介;那麼被翻爛的書今天的研究就先到啦!
感謝大家!
補充,SQL 轉換/宣告型別的用法: