我目前正在尝试重写WHERE子句。
WHERE (ISNULL(SIDE1,'')<>'' or ISNULL(SIDE2,'')<>'')
因此,如果SIDE1或SIDE2为空,则不会选择任何内容。
我还要包含评估字符串的WHERE子句。有时,SIDE1和SIDE2可以包含“其他”的值。我想以与上述陈述相同的方式对待它。因此,如果SIDE1或SIDE2为空,并且SIDE1或SIDE2包含值“other”。
提前致谢。
答案 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'
是的,我知道。很无聊,不是吗?当我们停止使用这些聪明的功能时,如ISNULL
,NULLIF
,COALESCE
等等,就没有乐趣......
但是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数据库(可能还有其他数据库)。