存储过程的以下片段:
@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
那样。
有不同/更好的方法吗?
答案 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结束