案例 - 为什么这不会返回它应该的东西

时间:2016-11-03 15:30:51

标签: sql sql-server

存储过程的以下片段:

@column1 varchar(50)
@column2 bit

SELECT column1 ,column2
FROM table1
WHERE column1 = case when @column1 = '' then column1 else @column1 end
  and column2 = case when @column2 = 0 then column2 else 1 end

不会返回任何内容。

当我删除此行时:

and column2 = case when @column2 = 0 then column2 else 1 end

按预期工作,如@column2 = 0那样。

有不同/更好的方法吗?

4 个答案:

答案 0 :(得分:1)

更简单,更易读和更可靠的方法是仅在需要检查时检查值:

WHERE (@column1 = '' OR column1 = @column1)
AND (@column2 = 0 OR column2 = @column2)

或者(可能)更好,当您不需要特定值时,为您的变量传递NULL:

WHERE (@column1 IS NULL OR column1 = @column1)
AND (@column2 IS NULL OR column2 = @column2)

使用NULL还允许column1需要空白而column2需要0,这些值在您保留这些值时不可能表示" don&#39关心" (此问题适用于您最终使用的任何方法)

答案 1 :(得分:0)

使用(NULL或值)AND(NULL或值)

@column1 varchar(50)
@column2 bit

SELECT column1
      ,column2
FROM table1
WHERE 
  ((@column1 IS NULL OR @Column1='') OR column1 = @column1)
  and 
  ((@column2 IS NULL) OR column2 = @column2)

答案 2 :(得分:0)

由于NULL不正确,您遇到问题NULL=NULL

使用这样的条件,这在查询优化器上也更容易:

WHERE ((@column1 = '') OR (column1 = @column1))

提示:如果在存储过程中有这个,最好在语句末尾添加OPTION (RECOMPILE),以便让查询优化器重新将@变量作为常量考虑运行。

答案 3 :(得分:0)

由于目前数据库中只有空值,所需的只是ISNULL(column2,0)= @ column2 = 0时的情况,然后是column2,另外1结束