1

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

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

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

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

提前致谢。

4

3 回答 3

1

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

这不是条件所说的:ORWHERE子句中意味着当 SIDE1SIDE2 都为空时,不选择任何内容;否则,其中一个<>评估为true,也使整体OR条件true成为。

如果您想以'other'与您相同的方式对待null,您可以使用in条件,如下所示:

WHERE (NOT ISNULL(SIDE1,'') IN ('', 'other')) ...
于 2013-05-15T21:33:20.290 回答
0

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

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

如果 SIDE1 或 SIDE2 之一既不是空白也不是“其他”,它将返回该行

于 2013-05-15T21:30:35.160 回答
0

无论使用哪种 DBMS,ISNULLWHERE子句上使用都可能会降低性能。

因此,如果您只担心避免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 数据库(可能还有其他数据库)。

于 2013-05-15T21:55:04.847 回答