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

时间:2013-07-25 06:36:13

标签: sql database sql-server-2008 stored-procedures

我有一个存储过程,它根据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

有没有办法做到这一点没有每个可能的组合(15个IF)都有IF

8 个答案:

答案 0 :(得分:36)

这样的东西
SELECT Id, col1, col2, col3, col4 
FROM    myTable 
WHERE   col1 LIKE @Param1+'%'
OR      @Param1 IS NULL

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

SELECT Id, col1, col2, col3, col4 
FROM    myTable 
WHERE   col1 LIKE ISNULL(@Param1,'')+'%'

但总的来说,你可以试试像

这样的东西
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)

答案 1 :(得分:3)

如果你的意思是@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

答案 2 :(得分:2)

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

这应该有帮助

问候

Ashutosh Arya

答案 3 :(得分:1)

您可以在SQL Server中使用use COALESCE()函数。您不需要在语句中使用IF- ElseCASE。以下是使用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)

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

答案 4 :(得分:0)

CREATE PROCEDURE myProcedure
  @Param1 nvarchar(50) **= '',**              //#1
  @Param2 nvarchar(50) **= '',**
  @Param3 nvarchar(50) **= '',**
  @Param4 nvarchar(50) **= ''**
AS
BEGIN
    **SET @Param1 = ISNULL(@Param1, '')**     //#2

    SELECT Id, col1, col2, col3, col4 FROM myTable WHERE col1 LIKE @Param1+'%' 
END
  1. 为您的参数提供默认值(空字符串”):如果调用者跳过传递这些参数,您将收到一个空字符串,该字符串可以与您的like子句正常工作(例如myProcedure @ Param4 ='some value' //在这种情况下,其他参数将设置为空string('')@ param1)
  2. 将params设置为''以使您避免使用空参数(例如myProcedure Param1 = null,@ param2 = null ... //在这种情况下将无法使用null值,并且不会给您任何记录参数,以避免再次检查空值。

答案 5 :(得分:0)

这至少对我来说是有效的并且更容易理解。 IIF语句仅在 SQL Server 2012 及更高版本中可用,您可以将其替换为case语句。

SELECT Id, col1, col2, ... 
FROM    myTable 
WHERE   condition1 = IIF(col1 IS NULL, col1, @Param1)
AND     condition2 = IIF(col2 IS NULL, col2, @Param2)...

答案 6 :(得分:0)

Declare @criteria nvarchar (max)
SELECT       col1,col2,col3
FROM            table1
((col1+col2+col3 like '%'+@criteria+'%')  OR ISNULL(@criteria, '') = '')

答案 7 :(得分:-1)

CASE .. WHEN .. THEN..的位置和使用位置添加条件

尝试以下方法。

select col1,col2,...colN..from Table 
Where clm1 = CASE WHEN @PARAMETER = 0 THEN **COL1** ELSE **@PARAMETER** 

一旦您将相同的列名设置为条件,然后从表中检索所有数据(如果要通过参数作为参数,然后根据表中的条件值进行检索)。