iT邦幫忙

2022 iThome 鐵人賽

DAY 23
0
Software Development

SQL rookie 之天天魯一下系列 第 23

Day 23 - SQL where clause with case when

  • 分享至 

  • xImage
  •  

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

https://ithelp.ithome.com.tw/upload/images/20221007/20150959k6lt5y6lpq.png

接著我想指定若是

情境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

如此得到的結果為:
https://ithelp.ithome.com.tw/upload/images/20221007/20150959ryz2ywn4e2.png

那我們能不能增加多個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

https://ithelp.ithome.com.tw/upload/images/20221007/20150959MgslwWTxHg.png

最後我們來試著加上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

https://ithelp.ithome.com.tw/upload/images/20221007/20150959pCfCY7mtU7.png

以上,是SQL WHERE clause 搭配CASE WHEN 的用法簡介;那麼被翻爛的書今天的研究就先到啦!
感謝大家!


補充,SQL 轉換/宣告型別的用法
https://ithelp.ithome.com.tw/upload/images/20221007/20150959UuoADAwfLh.png


上一篇
Day 22 - Active Record Query Interface: group method(2)
下一篇
Day 24 - count vs. size vs. length
系列文
SQL rookie 之天天魯一下30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言