case when 的基本結(jié)構(gòu)是連續(xù)使用多個(gè) when … then … 實(shí)現(xiàn)多條件分類,必須注意條件順序、邊界值處理、類型一致性和 else 子句的使用。1. 條件按順序執(zhí)行,滿足某條后不再繼續(xù)判斷;2. 所有不滿足時(shí)走 else(若存在),否則返回 NULL;3. 常見錯(cuò)誤包括條件順序錯(cuò)、邊界值漏、then 結(jié)果類型混用、遺漏 end 關(guān)鍵字。建議始終加上 else 明確默認(rèn)值,并確保條件覆蓋所有可能。
在 sql 查詢中,CASE WHEN 是實(shí)現(xiàn)多條件分類的常用方法。它有點(diǎn)像編程語言里的 if-else 語句,能根據(jù)不同條件返回不同的值。使用時(shí)只要把各種情況列清楚,就能把數(shù)據(jù)按需求分門別類。
基本結(jié)構(gòu)和多條件分類怎么寫?
CASE WHEN 的基本結(jié)構(gòu)是這樣的:
SELECT column_name, CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ... ELSE default_result END AS new_column_name FROM table_name;
要實(shí)現(xiàn)多條件分類,只需要連續(xù)寫多個(gè) WHEN … THEN …。比如你想根據(jù)銷售額給客戶打標(biāo)簽:
SELECT customer_id, sales_amount, CASE WHEN sales_amount > 10000 THEN 'VIP' WHEN sales_amount BETWEEN 5000 AND 10000 THEN '高價(jià)值' WHEN sales_amount BETWEEN 1000 AND 4999 THEN '普通' ELSE '低價(jià)值' END AS customer_type FROM customers;
這樣就完成了四個(gè)層級(jí)的分類。注意幾點(diǎn):
- 條件是有順序的,一旦滿足某條 WHEN 就不會(huì)再往下判斷。
- 所有條件都不滿足時(shí),會(huì)走 ELSE 分支(如果有的話)。
ELSE 子句遺漏了會(huì)怎樣?
很多人寫 CASE WHEN 時(shí)容易忽略 ELSE,其實(shí)這個(gè)子句非常重要。如果沒寫 ELSE,而所有 WHEN 條件都沒匹配上,那這一行的結(jié)果就是 NULL。
比如上面的例子,如果不寫最后一行 ELSE ‘低價(jià)值’,那么銷售額小于 1000 的客戶類型就會(huì)變成 NULL,而不是你預(yù)期的“低價(jià)值”。
這可能會(huì)帶來幾個(gè)問題:
- 數(shù)據(jù)分析結(jié)果不準(zhǔn)確,漏掉部分記錄。
- 后續(xù)處理中出現(xiàn)空值錯(cuò)誤,比如圖表展示異常、聚合統(tǒng)計(jì)出錯(cuò)。
- 如果你是做報(bào)表或接口輸出,NULL 值可能影響前端顯示邏輯。
所以建議:
- 不管有沒有明顯“默認(rèn)”情況,都加上 ELSE,哪怕只是為了兜底。
- 如果確實(shí)不想兜底,也要明確知道某些情況下會(huì)返回 NULL,并確保后續(xù)流程可以處理這種情況。
實(shí)際使用中有哪些常見坑?
除了 ELSE 容易漏掉,還有幾個(gè)地方容易出錯(cuò):
-
條件順序不對(duì):比如先寫了 WHEN sales_amount > 5000,再寫 WHEN sales_amount > 10000,那大于 10000 的也會(huì)被前面的條件捕獲,后面的不會(huì)執(zhí)行。
-
邊界值沒處理好:比如用 sales_amount >= 5000 AND sales_amount
-
THEN 后面的值類型不一致:雖然有些數(shù)據(jù)庫允許混合類型,但最好保持一致,避免隱式轉(zhuǎn)換導(dǎo)致奇怪的問題。
-
忘記寫 END:這是語法錯(cuò)誤,但新手偶爾會(huì)犯,尤其是嵌套多個(gè) CASE 的時(shí)候。
基本上就這些。寫得好一點(diǎn)的 CASE WHEN 不復(fù)雜,但細(xì)節(jié)處理不好也容易翻車。