如何在SQL查询中将特殊值视为NULL?

时间:2013-05-15 21:26:04

标签: sql

我目前正在尝试重写WHERE子句。

WHERE (ISNULL(SIDE1,'')<>'' or ISNULL(SIDE2,'')<>'')

因此,如果SIDE1或SIDE2为空,则不会选择任何内容。

我还要包含评估字符串的WHERE子句。有时,SIDE1和SIDE2可以包含“其他”的值。我想以与上述陈述相同的方式对待它。因此,如果SIDE1或SIDE2为空,并且SIDE1或SIDE2包含值“other”。

提前致谢。

3 个答案:

答案 0 :(得分:1)

  

因此,如果SIDE1或SIDE2为空,则不会选择任何内容。

这不是条件所说的:OR子句中的WHERE表示当SIDE1 SIDE2都为空时没有选择任何内容;否则,其中一个<>评估为true,同时也会OR条件true

如果您希望以对待'other'的同等方式对待null,则可以使用in条件,如下所示:

WHERE (NOT ISNULL(SIDE1,'') IN ('', 'other')) ...

答案 1 :(得分:0)

你的问题不清楚逻辑应该如何工作,但可能是这样的:

WHERE
(!ISNULL(SIDE1) OR !ISNULL(SIDE2))
OR
(SIDE1 != 'other' OR SIDE2 != 'other')

如果SIDE1或SIDE2中的一个既不是空白也不是“其他”

,那将返回该行

答案 2 :(得分:0)

无论使用何种DBMS,在ISNULL子句中使用WHERE都可能会降低性能。

所以,如果你只是担心避免NULL值,你应该只使用它:

WHERE
    SIDE1 IS NOT NULL AND SIDE2 IS NOT NULL.

但是你说你想要对待&#34;其他&#34;值为NULL。在这种情况下,为什么不这样做呢:

WHERE
    SIDE1 IS NOT NULL AND SIDE2 IS NOT NULL
    AND SIDE1 <> 'other' AND SIDE2 <> 'other'
是的,我知道。很无聊,不是吗?当我们停止使用这些聪明的功能时,如ISNULLNULLIFCOALESCE等等,就没有乐趣......

但是DBMS就像纳税一样:当我们避免使用聪明的技巧时,我们可能更安全。索引函数调用更难(并且,取决于实际的DBMS,甚至是不可能的)。这意味着如果我们在ISNULL子句上使用WHERE,我们很可能会对查询进行全面扫描。

所以,根据经验,如果你可以避免在WHERE子句上使用函数调用,那就去做吧。因为它不仅对DBMS引擎更好,对大多数人来说也更清楚......

修改

但是,当然,如果你真的坚持聪明,那么一个可能的答案就是

WHERE NULLIF(SIDE1, 'other') IS NOT NULL AND NULLIF(SIDE2, 'other') IS NOT NULL

甚至

WHERE COALESCE(NULLIF(SIDE1, 'other'), NULLIF(SIDE2, 'other')) IS NOT NULL

哪个适用于Oracle和MS SQL Server数据库(可能还有其他数据库)。