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
    
发布了69 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Min_Monk/article/details/103492654