40

我有一个存储过程,它根据 4 个参数从表中获取信息。

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

这是我的 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

有没有办法做到这一点,而不需要IF每个可能的组合(15 个 IF)?

4

8 回答 8

62

像这样的东西怎么样

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)
于 2013-07-25T06:38:20.663 回答
6

COALESCE()您可以在 SQL Server中使用使用功能。你不需要在你的语句中使用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)

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

于 2016-12-14T11:38:11.653 回答
4
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

这应该有帮助

问候

阿舒托什·艾莉亚

于 2013-07-25T06:41:05.553 回答
4

如果你的意思是 @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
于 2013-07-25T07:31:08.427 回答
1
Declare @criteria nvarchar (max)
SELECT       col1,col2,col3
FROM            table1
((col1+col2+col3 like '%'+@criteria+'%')  OR ISNULL(@criteria, '') = '')
于 2020-12-30T23:36:57.773 回答
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 设置为 '' 以使自己免受 null 参数的影响(例如 myProcedure Param1 = null,@param2 = null ... // 在这种情况下,like 将无法处理 null 值,并且不会为您提供针对参数的记录,为避免这种情况,请额外检查空值。
于 2020-08-27T09:20:40.683 回答
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)...
于 2020-09-02T16:31:52.367 回答
-4

在 where 和 using 中添加条件CASE .. WHEN .. THEN..

尝试以下方式。

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

一旦您在 WHERE 条件中设置了相同的列名,那么您将从表中检索所有数据,否则如果您想作为参数传递,则根据表中的条件值检索。

于 2019-02-27T07:21:54.147 回答