select
*
from
tb
where
(
case
when
col=
'***'
then
'***'
else
'***'
end
)=
'***'
SELECT
*
FROM
A
WHERE
( CASE WHEN PSTYP = '9' THEN POSID1 WHEN PSTYP = '0' THEN POSID2 END ) = '1'
DECODE(列名, 值1, 返回值1,值2,返回值2,默认值)
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支持这种写法,可以根据关键字来执行不同的条件
--可以理解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
--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
select
*
from
tb
where
(
case
when
col=
'***'
then
'***'
else
'***'
end
)=
'***'
转载于:https://www.cnblogs.com/volts0302/p/6128802.html
SQL之CASE WHEN用法进阶——where语句后跟case语句(二)
SQL之CASE WHEN用法进阶——Update语句使用case更新、数据对比(三)
在where后面使用case when的说明
报错语句
select *
from A, B
where B.name in
CASE
when A.id = 0 then ('aaa', 'bbb')
when A.id = 1 then ('bbb', 'ccc')
when A.id = 2 then ('ccc', 'ddd')
END
正确写法:将B.name in 放到CASE END 中
select *
from A, B
where
CASE
when A.id = 0 then B.name in ('aaa', 'bbb')
when A.id = 1 then B.name in ('bbb', 'ccc')
when A.id = 2 then B.name in ('ccc', 'ddd')
END
补充:当使用 B.name = 时,将不会出现以上问题,也就是如下写法也正确
select *
from A, B
where B.name =
CASE
when A.id = 0 then 'aaa'
when A.id = 1 then 'bbb'
when A.id = 2 then 'ccc'
END