【问题标题】:Search with several parameters in stored procedure that may be null [duplicate]在存储过程中使用可能为空的多个参数进行搜索 [重复]
【发布时间】:2019-02-09 15:46:25
【问题描述】:

我创建了一个搜索器如下:

create procedure [dbo].[search_pazhoheshgar]
    @se_code_melli varchar(10) = NULL,
    @se_name nvarchar(30) = NULL,
    @se_family nvarchar(30) = NULL,
    @se_name_uni nvarchar(100) = NULL,
    @se_name_reshte_tahsili nvarchar(50) = NULL
as
begin try
begin tran
    set nocount on;

    select 
        sabt.code_melli, sabt.name, sabt.family, 
        sabt_como_univercity.name_uni,
        sabt_como_reshte.name_reshte_tahsili
    from 
        sabt 
    inner join 
        sabt_como_univercity on sabt.univercity = sabt_como_univercity.id_uni
    inner join 
        sabt_como_reshte on sabt.name_reshte = sabt_como_reshte.id_reshte_tahsili
    where 
        @se_code_melli is not null
        and @se_code_melli <> '' 
        and sabt.code_melli like '%' + @se_code_melli + '%' 
         or @se_name is not null 
        and @se_name <> ''  
        and sabt.name like '%' + @se_name + '%' 
         or @se_family is not null
        and @se_family <> '' 
        and sabt.family like '%' + @se_family + '%' 
         or @se_name_uni is not null 
        and @se_name_uni <> '' 
        and sabt_como_univercity.name_uni like '%' + @se_name_uni + '%' 
         or @se_name_reshte_tahsili is not null
        and @se_name_reshte_tahsili <> '' 
        and sabt_como_reshte.name_reshte_tahsili like '%' + @se_name_reshte_tahsili + '%'

    commit tran
end try
begin catch
    rollback tran
    return -1
end catch

当我使用参数搜索时,这不是问题。但是当我设置几个参数时,最后输入的参数被放置为搜索条件。 显然,这个问题是由于OR的存在。现在如果我使用 AND 而不是 OR,我不能将值设为 NULL,因为搜索无效。我该怎么办?

【问题讨论】:

  • sqlsentry.tv/the-kitchen-sink-procedure
  • 另外,请不要害怕在编写查询时使用空格。它不仅对您自己,对其他人也更具可读性。

标签: sql sql-server stored-procedures


【解决方案1】:

我相信你想要的逻辑是:

WHERE (@se_code_melli IS NULL OR sabt.code_melli LIKE '%' + @se_code_melli + '%') AND 
      (@se_name IS NULL OR sabt.name like '%' + @se_name + '%') AND
       . . .

即检查某个参数是否为NULLOR条件匹配。然后这些条件通过AND连接起来。

【讨论】:

    【解决方案2】:

    我将从使用括号开始,因为不清楚您要达到什么目的。您是否要返回在列中至少找到一个值的所有记录?

    WHERE
    (COALESCE(@se_code_melli,'') != '' AND  sabt.code_melli LIKE '%' + @se_code_melli + '%') OR 
    (COALESCE(@se_name,'') != '' AND sabt.name like '%' + @se_name + '%') OR  
    (COALESCE(@se_family,'') != '' AND sabt.family like '%' + @se_family + '%') OR
    (COALESCE(@se_name_uni,'') != '' AND sabt_como_univercity.name_uni like '%' + @se_name_uni + '%') OR
    (COALESCE(@se_name_reshte_tahsili,'') != '' AND sabt_como_reshte.name_reshte_tahsili like '%' + @se_name_reshte_tahsili + '%')
    

    【讨论】:

    • +1 提倡使用括号。 SQL 会以固定的方式解释 and & or,但谁有时间去了解它是什么。括号让你的意图更清晰。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多