我知道我可以通过在CASE语句中轻松地放入两个完整的语句来实现这一点,但我是SQL的新手,并试图学习以最有效和最智能的方式编写这个而不重复任何逻辑,所以我想也许有一种方法我可以基本打开或关闭where条件线。
我有以下声明(btw不起作用,缺少一个关键字):
OPEN O_CURSOR FOR
SELECT S.STORE_NO_4_DIGIT AS STORE_NO, S.STORE_NAME
FROM RFS.RF_STORE S
WHERE S.TYPE_CODE != 'W'
AND
CASE I_CAN_BE_CLOSED
WHEN 0 THEN
S.CLOSE_DATE IS NULL
END
ORDER BY S.STORE_NO_4_DIGIT;
有两种情况基于输入变量I_CAN_BE_CLOSED,值为0或1.
在一种情况下,我想允许它返回只有NULL CLOSE_DATES的商店,而在另一种情况下我希望它返回(关闭和非关闭商店)。
答案 0 :(得分:1)
听起来你只想OR
一起使用几个谓词
AND ((i_can_be_closed = 0 and s.close_date IS NULL) or
(i_can_be_closed = 1))
答案 1 :(得分:1)
CASE表达式不能在Oracle SQL中返回布尔值。这应该是等效的,前提是I_CAN_BE_CLOSED永远不是NULL:
OPEN O_CURSOR FOR
SELECT S.STORE_NO_4_DIGIT AS STORE_NO, S.STORE_NAME
FROM RFS.RF_STORE S
WHERE S.TYPE_CODE != 'W'
AND (I_CAN_BE_CLOSED != 0 OR S.CLOSE_DATE IS NULL)
ORDER BY S.STORE_NO_4_DIGIT;
修改强>
事实上,这里给出的答案都是正确的......最简单的验证方法是在真假表中写下每个案例:
I_CAN_BE_CLOSED S.CLOSE_DATE [1] [2]
0 NULL FALSE OR TRUE = TRUE (TRUE AND TRUE) OR FALSE = TRUE
0 NOT NULL FALSE OR FALSE = FALSE (TRUE AND FALSE) OR FALSE = FALSE
1 NULL TRUE OR TRUE = TRUE (FALSE AND TRUE) OR TRUE = TRUE
1 NULL TRUE OR FALSE = TRUE (FALSE AND FALSE) OR TRUE = TRUE
[1] == "I_CAN_BE_CLOSED != 0 OR S.CLOSE_DATE IS NULL"
[2] == "((i_can_be_closed = 0 and s.close_date IS NULL) or (i_can_be_closed = 1))"