我有一个如下所示的查询。
select * from tbl a
WHERE a.device_cat =
(CASE (SELECT :VIEW1
FROM DUAL
WHERE :VIEW1 IN
(SELECT DISTINCT version
FROM tbl2))
WHEN NULL
THEN
NULL
ELSE
DECODE (:device_cat, 'ALL', a.device_cat, :device_cat)
END)
因此,当以下查询为null时,a.device_cat应为null,如果是,则上述查询将始终返回空记录。但是,当a.device_cat为null时,记录肯定存在。请帮我!谢谢!
(SELECT :VIEW1
FROM DUAL
WHERE :VIEW1 IN
(SELECT DISTINCT version
FROM tbl2)
答案 0 :(得分:2)
您无法将null
与null
进行比较。
就像:
undefined = undefined
哪个不正确......你不知道的事情并不是你不知道的事情。至少,在SQL中。
您可以使用coalesce
来规避这一点:
WHERE coalesce(a.device_cat, '###') =
(CASE (SELECT coalesce(:VIEW1, '###')
答案 1 :(得分:2)
你不能像这样比较null:
a.device_cat =null
试试这个:
select * from tbl a
WHERE nvl(a.device_cat, 0) =
nvl((CASE (SELECT :VIEW1
FROM DUAL
WHERE :VIEW1 IN
(SELECT DISTINCT version
FROM tbl2))
WHEN null
THEN
null
ELSE
DECODE (:device_cat, 'ALL', a.device_cat, :device_cat)
END), 0)
答案 2 :(得分:1)
永远不会达到WHEN NULL
的情况,因为在SQL中NULL
s彼此不相等。
切换到其他CASE
语法应该可以,但是:
CASE
WHEN (
SELECT :VIEW1 FROM DUAL WHERE :VIEW1 IN (SELECT DISTINCT version FROM tbl2)
) IS NULL
THEN NULL
ELSE DECODE (:device_cat, 'ALL', a.device_cat, :device_cat)
END
此表达式使用IS NULL
运算符代替比较,提供所需的行为。