如何重构此查询,以便没有COALESCE或ISNULL?我可以更改它以便使用CASE吗?有没有其他方法可以重构它?
SELECT * FROM MockDb WHERE
COALESCE(Column1,0) = @value1 AND
COALESCE(Column2,0) = @value2 AND
COALESCE(Column3,0) = @value3 AND
COALESCE(Column4,0) = @value4 AND
COALESCE(Column5,0) = @value5
答案 0 :(得分:1)
这看似奇怪的逻辑 - 将列中的NULL
值视为“0”。
你可以写:
where (column1 = @value1 or @value1 = 0 and column1 is null) and
(column2 = @value2 or @value2 = 0 and column2 is null) and
. . .
通常,关注的是允许参数的NULL
值。我希望看到如下的逻辑:
where (column1 = @value1 or @value1 is null) and
(column2 = @value2 or @value2 is null) and
. . .
此版本将参数中的NULL
值视为“忽略此列以进行过滤”。您的版本处理列本身中的NULL
值。
答案 1 :(得分:1)
你可以替换
coalesce(column1, 0)
与
case when column1 is null then 0 else column1 end
但是,你可以提出另一个条件:
(column1=@value1) OR (column1 is null AND @value1=0)