Sql 有条件地将where添加到语句中

Sql 有条件地将where添加到语句中,sql,sql-server,Sql,Sql Server,我正在写一个存储过程 此过程将获得4个参数,这些参数将在where子句中使用。问题是这些参数可能为空 我试着写这样的东西: select * from Books If(@param1 <> "") add where title =@param1 to the clause 从书本中选择* 如果(@param1“”) 添加其中title=@param1 对该条款的补充 但是我不知道怎么做。有可能吗?你可以这样试试 Select * from Books where (Titl

我正在写一个存储过程

此过程将获得4个参数,这些参数将在
where
子句中使用。问题是这些参数可能为空

我试着写这样的东西:

select * from Books
If(@param1 <> "")
add where title =@param1 
to the clause
从书本中选择*
如果(@param1“”)
添加其中title=@param1
对该条款的补充
但是我不知道怎么做。有可能吗?

你可以这样试试

Select * from Books where (Title=@title or @title='') 
你可以这样试试

Select * from Books where (Title=@title or @title='') 

这种类型的查询称为。有几种方法可以做到这一点,其中之一是使用
以及
条件的组合:

SELECT * 
    FROM Books
    WHERE
        (@param1 = '' OR title = @param1)
另一种方法是使用动态sql:

DECLARE @sql NVARCHAR(MAX) = ''
SELECT @sql = 'SELECT * FROM Books WHERE 1 = 1'

IF @param1 <> '' BEGIN
    SELECT @sql = @sql + ' AND title = @param1'
END

EXEC sp_executesql 
    @sql,
    N'@param1 VARCHAR(10)',
    @param1 = @param1
DECLARE@sql NVARCHAR(MAX)=”
选择@sql='SELECT*从1=1的书籍中选择'
如果@param1“”开始
选择@sql=@sql+'和title=@param1'
结束
EXEC sp_executesql
@sql,
N'@param1 VARCHAR(10)',
@param1=@param1
补充阅读:

  • Erland Sommarskog关于

这种类型的查询称为。有几种方法可以做到这一点,其中之一是使用
以及
条件的组合:

SELECT * 
    FROM Books
    WHERE
        (@param1 = '' OR title = @param1)
另一种方法是使用动态sql:

DECLARE @sql NVARCHAR(MAX) = ''
SELECT @sql = 'SELECT * FROM Books WHERE 1 = 1'

IF @param1 <> '' BEGIN
    SELECT @sql = @sql + ' AND title = @param1'
END

EXEC sp_executesql 
    @sql,
    N'@param1 VARCHAR(10)',
    @param1 = @param1
DECLARE@sql NVARCHAR(MAX)=”
选择@sql='SELECT*从1=1的书籍中选择'
如果@param1“”开始
选择@sql=@sql+'和title=@param1'
结束
EXEC sp_executesql
@sql,
N'@param1 VARCHAR(10)',
@param1=@param1
补充阅读:

  • Erland Sommarskog关于

如果希望在参数中处理null,并希望在标题字段中包含null的记录,则可以使用

select *
from Books
where ISNULL(title,#)=ISNULL(@param,#) 

如果希望在参数中处理null,并希望在标题字段中包含null的记录,则可以使用

select *
from Books
where ISNULL(title,#)=ISNULL(@param,#) 

其中(Field=@Param或@Param为NULL)和(Otherfield=@Otherparam或@Otherparam为NULL)
等等。
其中(Field=@Param或@Param为NULL)和(Otherfield=@Otherparam或@Otherparam为NULL)
等等……我不喜欢这种方法。这使得查询不可用-sargable@MotoGP这取决于需求。有多种方法做同样的事情,你也可以优化这一个。我不喜欢这种方法。这使得查询不可用-sargable@MotoGP这取决于需求。做同一件事有多种方法,你也可以优化这一种。