【问题标题】:Search by one query in prodecure在程序中按一个查询搜索
【发布时间】:2019-03-21 10:12:13
【问题描述】:

在我的网站中,我有一个按名称、zip、guid 等搜索的字段。现在它只适用于名称。我写了一个简单的查询

where (funeral_home_name like CONCAT('%', @searchFilter ,'%')) OR (funeral_home_zip5 like CONCAT('%', @searchFilter, '%'));

它工作正常,但我需要将此代码插入到带有“case”语句的存在过程中

where funeral_home_name like case when @searchFilter != '' then CONCAT('%',@searchFilter,'%') else '%' end ...

那我该怎么做呢?

【问题讨论】:

  • 为什么不构造动态where子句并在执行时添加呢?
  • WHERE 子句中使用AND/OR 结构而不是case 表达式 通常会更好。
  • 有数百个类似的问题,但最好的答案可能是 Erland Sommarskog 的 Dynamic Search Conditions in T‑SQL

标签: sql sql-server search


【解决方案1】:

您必须分别编写每个OR 条件,如下所示。你不能像使用 IN 那样使用单一条件来做到这一点

where (funeral_home_name like CONCAT('%',@searchFilter,'%') 
        or funeral_home_zip5  like  CONCAT('%',@searchFilter,'%') 
        or [guid] like CONCAT('%',@searchFilter,'%')) 
        or @searchFilter =''

【讨论】:

    【解决方案2】:

    我个人会使用布尔逻辑:

    WHERE funeral_home_name LIKE '%' + @searchFilter + '%'
       OR searchFilter = ''
    

    这使您的查询 SARGable,但是,您在这里拥有的是一个 Catch-all 查询。因此,您需要将OPTION (RECOMPILE) 添加到查询中,或者使用动态SQL 并为@searchFilter 的值创建适当的WHERE 子句。

    【讨论】:

      【解决方案3】:

      试试这个。这使用逻辑条件而不是 CASE 语句。

      注意:假定的 guid 列是 funeral_home_guid

      WHERE (@searchFilter='' or (funeral_home_name Like '%'+searchFilter+'%' 
                                  or funeral_home_zip5 Like '%'+searchFilter+'%' 
                                  or funeral_home_guid like '%'+searchFilter+'%'))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-06
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-12
        相关资源
        最近更新 更多