SQL:如果参数为null,则选择所有行,否则仅选择匹配的行

时间:2012-06-12 15:00:14

标签: sql sql-server-2008-r2 isnull

我有一个变量进入存储过程。此变量可以具有值或为null。

  • 如果变量为null,我需要选择表中的所有行(一些具有NULL值,一些具有实际数据)。
  • 如果变量不为null,我只需要选择变量与列匹配的行。

我创建了这个条件语句来帮助解释我想要实现的目标:

if 

@status is null, select all the rows (rows with NULL for table.status, and rows with actual data for table.status)

else

select the rows where @status equals table.status

这就是我提出的(其中一个):

WHERE 
   book.book_nme LIKE @search_input AND
   book.book_desc LIKE @search_input AND 
   (book.author LIKE ISNULL(@author, book.author)) AND
   (bookStatus.status_desc LIKE ISNULL(@status, bookStatus.status_desc))

唯一的问题是,如果bookStatus.status_desc为NULL,则它不会选择该行(当@status为空时)

我很困惑,我也试着查看Coalesce,它似乎优先考虑价值观,但是......我不知道该怎么办。

我是否应该在存储过程中创建一个巨大的CASE并有两个select语句?

4 个答案:

答案 0 :(得分:6)

WHERE  book.book_nme LIKE @search_input AND
book.book_desc LIKE @search_input AND 
(@author IS NULL OR book.author LIKE @author) AND
(@status IS NULL OR bookStatus.status_desc LIKE @status) ...

<强>更新
@author@status

添加了两个条件

答案 1 :(得分:3)

如果你认为它与你的描述有关,那就分解为:

  • @status为空时返回所有行
  • 否则返回与@status匹配的行。

你可以像这样表达你的sql的最后一行:

(@status is null OR bookStatus.status_desc LIKE @status)

答案 2 :(得分:0)

我总是使用这个:

WHERE fieldname = ISNULL(@parameter,fieldname)

希望这会有所帮助 罗杰

答案 3 :(得分:0)

where(field1 like isnull(@parameter,field1))

如果参数为null,则将从field1中检索所有数据 像

select field from table1

这适用于sybase。