因此,我在庞大的查询中有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'
,一切都会起作用,但这是最好的方法吗?
对于要返回“主”查询的小尺寸记录,我几乎想对存在执行另一个检查。
答案 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)代替''