用表壳替换合并

时间:2016-08-09 10:55:11

标签: sql database tsql

如何重构此查询,以便没有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

2 个答案:

答案 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)