存储过程忽略Null,仅获取输入参数的结果

时间:2020-03-18 03:13:24

标签: sql sql-server stored-procedures

我正在创建一个存储过程来通过表进行搜索。我有许多不同的搜索列,所有这些都是可选的。有没有一种方法可以创建存储过程来处理呢?假设我有一个包含四个列ID,N1,N2和N3的表。我可以做这样的事情:

表格:

INSERT INTO [dbo].[Sample]
VALUES ('1', 'A,B,C', 'A,B,C', 'A,B,C'),
       ('2', 'B,D,N', 'B,D,N', 'B,D,N'),
       ('3', 'A,N,S', 'A,N,S', 'A,N,S'),
       ('4', 'S,F,G', 'S,F,G', 'S,F,G'),
       ('5', 'D,F,K', 'D,F,K', 'D,F,K'),
       ('6', 'S,H,Y', 'S,H,Y', 'S,H,Y'),
       ('7', 'Z,B,C', 'Z,B,C', 'Z,B,C')

存储过程:

CREATE PROCEDURE dbo.Sample2
    @n11 varchar(max) = null,  
    @n12 varchar(max) = null,
    @n21 varchar(max) = null,
    @n22 varchar(max) = null,
    @n31 varchar(max) = null,
    @n32 varchar(max) = null
AS        
BEGIN      
    SELECT COUNT(*) 
    FROM Sample
    WHERE 
        (@n11 IS NULL OR Sample.N1 LIKE '%' + @n11 + '%' 
         OR @n12 IS NULL OR Sample.N1 LIKE '%' + @n12 + '%')
        AND (@n21 IS NULL OR Sample.N2 LIKE '%' + @n21 + '%' 
             OR @n22 IS NULL OR Sample.N2 LIKE '%' + @n22 + '%')
        AND (@n31 IS NULL OR Sample.N3 LIKE '%' + @n31 + '%' 
             OR @n32 IS NULL OR Sample.N3 LIKE '%' + @n32 + '%')
END

如果用户输入@ n11作为A,其余的则保留,因为N1在2行中包含A,所以输出应为2,但上面的查询提供了7。如果未指定参数,则需要忽略该参数并传递休息一下。

3 个答案:

答案 0 :(得分:1)

我认为您需要AND每个单独的输入条件,例如

SELECT count(*)
FROM [Sample] S
WHERE (@n11 IS NULL OR S.N1 LIKE '%'+@n11+'%')
AND (@n12 IS NULL OR S.N1 LIKE '%'+@n12+'%')
AND (@n21 IS NULL OR S.N2 LIKE '%'+@n21+'%')
AND (@n22 IS NULL OR S.N2 LIKE '%'+@n22+'%')
AND (@n31 IS NULL OR S.N3 LIKE '%'+@n31+'%')
AND (@n32 IS NULL OR S.N3 LIKE '%'+@n32+'%')

请注意别名,这是避免在整个查询中重复长表名的最佳实践方法。

答案 1 :(得分:0)

尝试从存储过程查询中删除以下条件:

buttonClicked() { return alert("clicked") }
@n12 IS NULL
@n22 IS NULL

由于上述条件在返回调用过程时始终为true。

修改后的存储过程代码:

@n32 IS NULL

现在执行Alter Procedure dbo.Sample2 @n11 varchar(max) = null, @n12 varchar(max) = null, @n21 varchar(max) = null, @n22 varchar(max) = null, @n31 varchar(max) = null, @n32 varchar(max) = null AS BEGIN select count(*) from Sample where (@n11 IS NULL OR Sample.N1 LIKE '%'+@n11+'%' OR Sample.N1 LIKE '%'+@n12+'%') AND (@n21 IS NULL OR Sample.N2 LIKE '%'+@n21+'%' OR Sample.N2 LIKE '%'+@n22+'%') AND (@n31 IS NULL OR Sample.N3 LIKE '%'+@n31+'%' OR Sample.N3 LIKE '%'+@n32+'%') END 时,输出将是2而不是7

答案 2 :(得分:0)

select
  sum(iif(N1 like '%'+@N11+'%',1,0)  
    + iif(N1 like '%'+@N12+'%',1,0) 
    + iif(N2 like '%'+@N21+'%',1,0) 
    + iif(N2 like '%'+@N22+'%',1,0) 
    + iif(N3 like '%'+@N31+'%',1,0) 
    + iif(N3 like '%'+@N32+'%',1,0) 
  )
from Sample

任何NULL变量都将被忽略。