我目前正在尝试重写 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等等......NULLIFCOALESCE
但是 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 数据库(可能还有其他数据库)。