- 準備測試數據,建表語句
drop table test_table; create table test_table ( col_a NUMBER, col_b NUMBER, col_c VARCHAR2(5) ) insert into test_table values(2, 1, '>'); insert into test_table values(1, 2, '>='); insert into test_table values(2, 1, '<'); insert into test_table values(1, 2, '<='); insert into test_table values(2, 2, '=');
- 測試目的
主要是想根據某個字段的不同,執行不同的where條件,很明顯在Mysql下是可以直接通過case-when來寫,但是oracle的case-when則不行,同樣的sql修改成oracl的語法就會報錯,不支持這種方式。但是如果真的存在這種業務場景,我們可以迂迴一下,多走一步來實現這種場景,達到同樣的目的。
- MySQL數據庫
--Mysql支持這種寫法,可以根據關鍵字來執行不同的條件 --可以理解case-when函數在Mysql下是可以返回直接執行的表達式 SELECT * FROM test_table WHERE CASE col_c WHEN '>' THEN col_a > col_b WHEN '>=' THEN col_a >= col_b WHEN '<' THEN col_a < col_b WHEN '<=' THEN col_a <= col_b WHEN '=' THEN col_a = col_b END
- Oracle
--Orale數據庫的case-when函數則不能返回直接執行的表達式 --但是我們可以轉個彎,在select關鍵字後,將關鍵字對應的 --表達式的計算結果值存爲臨時列,然後將結果集當一張臨時 --表,在根據where條件去過濾數據 select col_a, col_b, col_c from ( select col_a, col_b, col_c, (case when (col_c = '>' and (col_a - col_b) > 0) then 1 when (col_c = '>=' and (col_a - col_b) >= 0) then 1 when (col_c = '=' and (col_a - col_b) = 0) then 1 when (col_c = '<' and (col_a - col_b) < 0) then 1 when (col_c = '<=' and (col_a - col_b) <= 0) then 1 else 0 end) as temp from test_table ) where temp = 1