我目前正在尝试重写 WHERE 子句。
WHERE (ISNULL(SIDE1,'')<>'' or ISNULL(SIDE2,'')<>'')
因此,如果 SIDE1 或 SIDE2 为空,则不选择任何内容。
我还想包括评估字符串的 WHERE 子句。有时,SIDE1 和 SIDE2 可以包含“其他”值。我想以与上述陈述相同的方式对待它。因此,如果 SIDE1 或 SIDE2 为空,并且 SIDE1 或 SIDE2 包含值“其他”。
提前致谢。
我目前正在尝试重写 WHERE 子句。
WHERE (ISNULL(SIDE1,'')<>'' or ISNULL(SIDE2,'')<>'')
因此,如果 SIDE1 或 SIDE2 为空,则不选择任何内容。
我还想包括评估字符串的 WHERE 子句。有时,SIDE1 和 SIDE2 可以包含“其他”值。我想以与上述陈述相同的方式对待它。因此,如果 SIDE1 或 SIDE2 为空,并且 SIDE1 或 SIDE2 包含值“其他”。
提前致谢。
因此,如果 SIDE1 或 SIDE2 为空,则不选择任何内容。
这不是条件所说的:OR
在WHERE
子句中意味着当 SIDE1和SIDE2 都为空时,不选择任何内容;否则,其中一个<>
评估为true
,也使整体OR
条件true
成为。
如果您想以'other'
与您相同的方式对待null
,您可以使用in
条件,如下所示:
WHERE (NOT ISNULL(SIDE1,'') IN ('', 'other')) ...
您的问题不太清楚逻辑应该如何工作,但可能是这样的:
WHERE
(!ISNULL(SIDE1) OR !ISNULL(SIDE2))
OR
(SIDE1 != 'other' OR SIDE2 != 'other')
如果 SIDE1 或 SIDE2 之一既不是空白也不是“其他”,它将返回该行
无论使用哪种 DBMS,ISNULL
在WHERE
子句上使用都可能会降低性能。
因此,如果您只担心避免NULL
值,您应该简单地使用它:
WHERE
SIDE1 IS NOT NULL AND SIDE2 IS NOT NULL.
但是然后您说您想将“其他”值视为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 数据库(可能还有其他数据库)。