我已经在Stack的其他地方检查过,但我找不到类似的场景。
我想基本上将 PL/SQL 过程中的 1 个输入映射到 MY_TABLE 中的 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;
我不建议在where
中使用case
表达式。 只需使用更简单的布尔逻辑运算符:
WHERE COLUMN 1 = 'B' AND
( (p_input = 'F' AND COLUMN_1 IN ('F', 'A', 'B')) OR
COLUMN_1 = p_input
)
特别是,Oracle在SQL中没有布尔类型(在PL/SQL中有(。 因此,case 表达式不能返回布尔值。
如果您正在学习如何在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
在使用OR
时,使用负面条件p_input <> 'F'
第二个条件总是一个好主意:
(
(p_input = 'F' AND COLUMN_1 IN ('F', 'A', 'B'))
OR
(p_input <> 'F' AND COLUMN_1 = p_input)
)