where後面case-when的用法

  1. 準備測試數據,建表語句
    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, '=');

     

  2. 測試目的

      主要是想根據某個字段的不同,執行不同的where條件,很明顯在Mysql下是可以直接通過case-when來寫,但是oracle的case-when則不行,同樣的sql修改成oracl的語法就會報錯,不支持這種方式。但是如果真的存在這種業務場景,我們可以迂迴一下,多走一步來實現這種場景,達到同樣的目的。

  1. 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

     

  2. 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
    

     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章