CASE WHEN condition THEN result? [WHEN ...]? [ELSE result]? END?
CASE 子句可以用于任何表達式可以有效存在的地方。 condition 是一個返回boolean 的表達式。 如果結果為真,那么 CASE 表達式的結果就是符合條件的 result。 如果結果為假,那么以相同方式搜尋任何隨后的 WHEN 子句。 如果沒有 WHEN condition 為真,那么 case 表達式的結果就是在 ELSE 子句里的值。 如果省略了 ELSE 子句而且沒有匹配的條件, 結果為 NULL。
例子:???
??
SELECT?*?FROM?test;???
a???
---???
1???
2???
3???
SELECT?a,???
CASE?WHEN?a=1?THEN?'one'???
WHEN?a=2?THEN?'two'???
ELSE?'other'???
END???
FROM?test;???
a?|?case???
---+-------???
1?|?one???
2?|?two???
3?|?other?
所有 result 表達式的數據的類型都必須可以轉換成單一的輸出類型。??
下面這個"簡單的" CASE 表達式是上面的通用形式的一個特殊的變種。
CASE?expression???
WHEN?value?THEN?result???
[WHEN?...]???
[ELSE?result]???
END ??
先計算 expression 的值, 然后與所有在WHEN 子句里聲明的 value 對比,直到找到一個相等的。 如果沒有找到匹配的,則返回在 ELSE 子句里的 result (或者 NULL)。 這個類似于 C 里的 switch 語句。?
上面的例子可以用簡單 CASE 語法來寫:
SELECT?a,???
CASE?a?WHEN?1?THEN?'one'???
WHEN?2?THEN?'two'???
ELSE?'other'???
END???
FROM?test;???
a?|?case???
---+-------???
1?|?one???
2?|?two???
3?|?other?
CASE 表達式并不計算任何對于判斷結果并不需要的子表達式。 比如,下面是一個可以避免被零除的方法:?
SELECT ... WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END;? 例1:一道SQL語句面試題? 表內容:? 2005-05-09 勝? 2005-05-09 勝? 2005-05-09 負? 2005-05-09 負? 2005-05-10 勝? 2005-05-10 負? 2005-05-10 負?