如果参数为null,则SQL忽略WHERE的一部分

Joh*_*son 25 sql database stored-procedures sql-server-2008

我有一个存储过程,它基于4个参数从表中获取信息.

我想根据参数获取值,但如果参数为NULL,则不检查该参数.因此,如果所有4个参数都为null,我将显示整个表.

这是我的SP(如您所见,这仅适用于1个参数atm):

CREATE PROCEDURE myProcedure
    @Param1 nvarchar(50),
    @Param2 nvarchar(50),
    @Param3 nvarchar(50),
    @Param4 nvarchar(50)
AS
BEGIN
    IF(@Param1 IS NULL)
        BEGIN
            SELECT Id, col1, col2, col3, col4 FROM myTable
        END
    ELSE
        BEGIN
            SELECT Id, col1, col2, col3, col4 FROM myTable WHERE col1 LIKE @Param1+'%'
        END
END
Run Code Online (Sandbox Code Playgroud)

如果没有IF针对每种可能的组合(15个IF),有没有办法做到这一点?

Adr*_*der 43

怎么样的

SELECT Id, col1, col2, col3, col4 
FROM    myTable 
WHERE   col1 LIKE @Param1+'%'
OR      @Param1 IS NULL
Run Code Online (Sandbox Code Playgroud)

在这种特殊情况下你也可以使用

SELECT Id, col1, col2, col3, col4 
FROM    myTable 
WHERE   col1 LIKE ISNULL(@Param1,'')+'%'
Run Code Online (Sandbox Code Playgroud)

但总的来说,你可以尝试类似的东西

SELECT Id, col1, col2, col3, col4 
FROM    myTable 
WHERE   (condition1 OR @Param1 IS NULL)
AND     (condition2 OR @Param2 IS NULL)
AND     (condition3 OR @Param3 IS NULL)
...
AND     (conditionN OR @ParamN IS NULL)
Run Code Online (Sandbox Code Playgroud)

  • 谨防."IS NULL"导致完整的扫描表访问. (8认同)
  • 我有这个工作,但无法理解如果`@Param1 IS NULL`,`condition1`将如何被忽略.我有以下条件`(m.idAgent = agent OR agent is null)`.如果我将null传递给`agent` param,它只会返回所有代理.棒极了!你能解释一下吗? (4认同)

Aam*_*mir 10

您可以使用COALESCE()SQL Server 中的 use 函数。您不需要在语句中使用IF- Elseor 。CASE以下是如何使用COALESCE函数。

SELECT Id, col1, col2, col3, col4 FROM myTable where col1 = COALESCE(NULLIF(@param1, ''), col1) and col2 = COALESCE(NULLIF(@param2, ''), col2) and col3 = COALESCE(NULLIF(@param3, ''), col3) and col4=
COALESCE(NULLIF(@param4, ''), col4)
Run Code Online (Sandbox Code Playgroud)

SQL 中的函数COALESCE返回其参数中的第一个非 NULL 表达式。例如,如果 @param1 等于 null,函数将返回 col1,这将导致 where 语句中的 col1=col1,就像 1=1 意味着条件始终为 true。


Ash*_*rya 5

CREATE PROCEDURE myProcedure
    @Param1 nvarchar(50),
    @Param2 nvarchar(50),
    @Param3 nvarchar(50),
    @Param4 nvarchar(50)
AS
BEGIN
    IF(@Param1 IS NULL)
        BEGIN
            SELECT Id, col1, col2, col3, col4 FROM myTable
        END
    ELSE
        BEGIN
            SELECT Id, col1, col2, col3, col4 FROM myTable WHERE col1 LIKE @Param1+'%' OR @Param1 is Null
        END
END
Run Code Online (Sandbox Code Playgroud)

这应该有帮助

问候

阿苏托什·艾莉亚


Fau*_*i88 5

如果您的意思是 @param1 是 col1 的参数,@param2 是 col2 的参数,...等您可以尝试以下操作:

CREATE PROCEDURE myProcedure
@Param1 nvarchar(50),
@Param2 nvarchar(50),
@Param3 nvarchar(50),
@Param4 nvarchar(50)
AS
BEGIN
declare @query nvarchar(4000)
SET @query='SELECT Id, col1, col2, col3, col4 FROM myTable '+
    (case when ((@Param1 is null) and (@Param2 is null) and (@Param3 is null) and (@Param4 is null))
    then ''
    else
        'where '+
        (case when @Param1 is not null
        then ' col1 like '''+@param1+'%'''+
            (case when @param2 is not null then ' AND ' else '' end)
        else '' end)+
        (case when @Param2 is not null
        then ' col2 like '''+@param2+'%'''+
            (case when @param3 is not null then ' AND ' else '' end)
        else '' end)+
        (case when @Param3 is not null
        then ' col3 like '''+@param3+'%'''+
            (case when @param4 is not null then ' AND ' else '' end)
        else '' end)+
        (case when @Param4 is not null
        then ' col4 like '''+@param4+'%'''
        else '' end)
    end)

exec sp_sqlexec @query
Run Code Online (Sandbox Code Playgroud)