在case语句中字段不等于null的问题

时间:2018-11-07 16:51:42

标签: sql sql-server

因此,我在庞大的查询中有EXISTS,如下所示:

EXISTS(
   SELECT 
      * 
   FROM 
      ExistTable
   WHERE
      ExTableFieldA = @SomeGuid AND
      ExTableFieldB = MainTableFieldB AND
      ExTableFieldA <> (
                         CASE
                           WHEN MainTableFieldZ = 10 THEN MainTableFieldYYY
                           ELSE NULL
                         END
                       )
)

问题来自ELSE语句的CASE部分,此ExTableFieldA <> NULL始终为false。我可以轻松地编写另一个参数@EmptyGuid并使它等于'00000000-0000-0000-0000-000000000000',一切都会起作用,但这是最好的方法吗?

对于要返回“主”查询的小尺寸记录,我几乎想对存在执行另一个检查。

2 个答案:

答案 0 :(得分:3)

如何删除case并仅使用布尔逻辑?

WHERE ExTableFieldA = @SomeGuid AND
      ExTableFieldB = MainTableFieldB AND
      (MainTableFieldZ <> 10 OR ExTableFieldA <> MainTableFieldYYY)

我还建议您通过包含表别名来限定列名称。

注意:这确实假设MainTableFieldZ不是NULL。如果有这种可能性,那么可以很容易地合并该逻辑。

答案 1 :(得分:0)

ELSE NULL是隐含的,即使您没有列出它,也可以在此处使用ISNULL

ISNULL(ExTableFieldA,'') <> (
                         CASE
                           WHEN MainTableFieldZ = 10 THEN MainTableFieldYYY
                           ELSE ''
                         END
                       )

您可能需要使用其他值(例如9999)代替''