【问题标题】:Multiple conditional Where clause多个条件 Where 子句
【发布时间】:2015-09-29 19:34:28
【问题描述】:

我目前有一个查询,它将根据我想要使用的任何where 条件从我的数据库中提取大量信息。

declare @CaseNum char(7),
        @ImportId char,
        @FormatId char,
        @SessionId char(5)


set @CaseNum = ''  --I can place the value that I want to search by in here
set @ImportId = ''
set @FormatId = ''
set @SessionId = ''

--------------------
   query in here
--------------------

where 
     gr.[CaseNum] = @CaseNum  --currently I have to comment the ones I'm not using out
     --im.[ImportId] = @ImportId
     --fr.[FormatId] = @FormatId
     --se.[SessionId] = @SessionId

如果参数 = '',我希望能够取出注释部分并简单地显示所有行

例如,如果我使用set @CaseNum = '1234567',那么它将按该参数进行搜索,如果我使用@FormatId = '12',它将按该参数进行搜索。

我已经尝试使用以下方法和其他一些尝试,但我没有快速取得任何进展。

where 
     gr.[CaseNum] = '%' + @CaseNum + '%'
     and im.[ImportId] = '%' + @ImportId + '%'
     and fr.[FormatId] = '%' + @FormatId + '%'
     and se.[SessionId] = '%' + @SessionId + '%'

【问题讨论】:

  • 你可以使用where ( gr.[CaseNum] = @CaseNum or @CaseNum is NULL ) and ...之类的东西,但是如果你重用执行计划,性能会受到影响。为每组参数重新编译查询将有所帮助,或者即时构建查询并执行生成的动态 SQL。查看页面右侧显示的一些“相关”SO 帖子,了解更多关于“动态 SQL”的信息。

标签: sql tsql parameters sql-server-2014


【解决方案1】:

在@Norman 发布的链接的帮助下,我想通了。我想发布我的解决方案供其他人查看。

declare @CaseNum varchar(MAX),
        @ImportId varchar(MAX)


set @CaseNum = ''
set @ImportId = ''
----------------------------------------------------------------------------

If(@CaseNum = '')    --Sets the parameter to NULL for COALESCE to work
Begin
    Select @CaseNum = NULL
End

If(@ImportId = '')   --Sets the parameter to NULL for COALESCE to work
Begin
    Select @ImportId = NULL
End

--------------------
   query in here
--------------------

where
    gr.[CaseNum] = COALESCE(@CaseNum, gr.[CaseNum])
    and im.ImportId = COALESCE(@ImportId, im.ImportId)

此解决方案允许查询仅使用单个参数或同时使用所有参数。

【讨论】:

    【解决方案2】:

    您可能想考虑构建您的查询。

    DECLARE @Number varchar(10)
    DECLARE @Where varchar(max)
    DECLARE @Query varchar(max)
    
    SET @Query = 'SELECT * FROM TestTable'
    SET @Where = ''
    
    SET @Number = '3'
    
    IF ISNULL(@Number, '') != ''
    BEGIN
        SET @Where = @Where + 'and testNumber = ' + @Number
    END
    
    IF LEN(@Where) > 0
    BEGIN
        SET @Where = SUBSTRING(@Where, 4, LEN(@Where))
    END
    
    if ISNULL(@Where, '') != ''
    BEGIN
        SET @Query = @Query + ' WHERE ' + @Where
    END
    
    EXEC(@Query)
    

    查看这位先生的文章以供参考:https://social.msdn.microsoft.com/forums/sqlserver/en-US/1ec6ddd9-754b-4d78-8d3a-2b4da90e85dc/dynamically-building-where-clauses

    【讨论】:

    • 这似乎是一个很好的解决方案。我必须在星期一检查一下,看看它是否有效。
    • 您提供的信息很棒!我还发布了我的确切解决方案。
    猜你喜欢
    • 2018-06-10
    • 2015-07-07
    • 1970-01-01
    • 2019-02-09
    • 2012-05-06
    • 2017-05-12
    • 1970-01-01
    相关资源
    最近更新 更多