为什么这种情况在oracle中不起作用

时间:2014-04-25 15:29:37

标签: sql oracle

我有一个如下所示的查询。

 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)  

3 个答案:

答案 0 :(得分:2)

您无法将nullnull进行比较。

就像:

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运算符代替比较,提供所需的行为。