我已经检查了堆栈上的其他地方,但找不到类似的场景。我想将pl/sql过程中的1个输入Map到我的表中的3个不同的值;否则我只想过滤输入。我想解决类似下面的伪代码
SELECT * FROM MY_TABLE WHERE COLUMN 1 = 'B' AND CASE WHEN p_input = 'F' THEN COLUMN_1 IN ('F','A','B') ELSE COLUMN_1 = p_input;
b5buobof1#
我不建议使用 case 中的表达式 where . 只需使用更简单的布尔逻辑运算符:
case
where
WHERE COLUMN 1 = 'B' AND ( (p_input = 'F' AND COLUMN_1 IN ('F', 'A', 'B')) OR COLUMN_1 = p_input )
特别是,oracle在sql中没有布尔类型(pl/sql中有on)。所以case表达式不能返回布尔值。
monwx1rj2#
如果你正在学习如何使用 case..when 在 where 那么下面是代码:
case..when
CASE WHEN p_input = 'F' AND COLUMN_1 IN ('F','A','B') THEN 1 WHEN COLUMN_1 = p_input THEN 1 END = 1
但正如其他答案所建议的,建议使用 or 使用否定条件总是一个好主意 p_input <> 'F' 在第二种情况下使用 OR 具体如下:
or
p_input <> 'F'
OR
( (p_input = 'F' AND COLUMN_1 IN ('F', 'A', 'B')) OR (p_input <> 'F' AND COLUMN_1 = p_input) )
2条答案
按热度按时间b5buobof1#
我不建议使用
case
中的表达式where
. 只需使用更简单的布尔逻辑运算符:特别是,oracle在sql中没有布尔类型(pl/sql中有on)。所以case表达式不能返回布尔值。
monwx1rj2#
如果你正在学习如何使用
case..when
在where
那么下面是代码:但正如其他答案所建议的,建议使用
or
使用否定条件总是一个好主意p_input <> 'F'
在第二种情况下使用OR
具体如下: