【问题标题】:does varchar column contain an optional range of keywordsvarchar 列是否包含可选的关键字范围
【发布时间】:2016-05-07 03:57:51
【问题描述】:

我有以下查询,我在其中选择 varchar 列包含传递到存储过程的最多五个可选关键字中的任何一个。

@keyword1 varchar(100) = null
@keyword2 varchar(100) = null
@keyword3 varchar(100) = null
@keyword4 varchar(100) = null
@keyword5 varchar(100) = null

SELECT supplier_code 

FROM crm_cache

WHERE  (@keyword1 IS NULL OR crm_cache.search_string LIKE ('%' + @keyword1 + '%'))
    OR (@keyword2 IS NULL OR crm_cache.search_string LIKE ('%' + @keyword2 + '%'))
    OR (@keyword3 IS NULL OR crm_cache.search_string LIKE ('%' + @keyword3 + '%'))
    OR (@keyword4 IS NULL OR crm_cache.search_string LIKE ('%' + @keyword4 + '%'))
    OR (@keyword5 IS NULL OR crm_cache.search_string LIKE ('%' + @keyword5 + '%'))

当所有五个关键字都已传递且不为空时,它可以正常工作并返回,但如果我提供关键字 1 和 2,则将 3,4 和 5 默认为空。返回的数据量大且不正确。

如果我删除 null 子句并像下面这样设置关键字 1 和 2,我会得到正确的数据,即三行

@keyword1 varchar(100) = 'ruby'
@keyword2 varchar(100) = 'silver cross'
@keyword3 varchar(100) = null

SELECT supplier_code 

FROM crm_cache

WHERE  (@keyword1 IS NULL OR crm_cache.search_string LIKE ('%' + @keyword1 + '%'))
    OR (@keyword2 IS NULL OR crm_cache.search_string LIKE ('%' + @keyword2 + '%'))

但是使用具有空变量(如关键字 3)的子句,我会返回数百行

我应该如何实现这样的查询,它具有与一列进行比较的可选参数?

我应该使用 Contains 而不是 LIKE?

你能看出我在条件中的逻辑哪里错了吗?

【问题讨论】:

    标签: sql sql-server search range optional-parameters


    【解决方案1】:

    你的逻辑是正确的,但不是你想要的。如果你使用AND,那就没问题了:

    WHERE (@keyword1 IS NULL OR crm_cache.search_string LIKE ('%' + @keyword1 + '%')) AND
          (@keyword2 IS NULL OR crm_cache.search_string LIKE ('%' + @keyword2 + '%')) AND
          (@keyword3 IS NULL OR crm_cache.search_string LIKE ('%' + @keyword3 + '%')) AND
          (@keyword4 IS NULL OR crm_cache.search_string LIKE ('%' + @keyword4 + '%')) AND
          (@keyword5 IS NULL OR crm_cache.search_string LIKE ('%' + @keyword5 + '%'))
    

    但这不是你想要的。我认为您可以省略 NULL 比较:

    WHERE (crm_cache.search_string LIKE ('%' + @keyword1 + '%')) OR
          (crm_cache.search_string LIKE ('%' + @keyword2 + '%')) OR
          (crm_cache.search_string LIKE ('%' + @keyword3 + '%')) OR
          (crm_cache.search_string LIKE ('%' + @keyword4 + '%')) OR
          (crm_cache.search_string LIKE ('%' + @keyword5 + '%'))
    

    当关键字之一是NULL 时,子句返回NULL(被视为不正确)。但是,如果任何一个为真,那么OR 将返回真。这就是你想要的逻辑。

    【讨论】:

      【解决方案2】:
      @keyword1 IS NULL OR crm_cache.search_string LIKE ('%' + @keyword1 + '%')
      
      • 如果@keyword1 为NULL,则无论其他检查如何,整个条件都将为真,因为它都是ORs。所有其他变量都一样。

      你需要这个:

      @keyword1 IS NOT NULL AND crm_cache.search_string LIKE ('%' + @keyword1 + '%')
      

      ...对于每个变量,与OR 结合在一起,就像现在一样。但逻辑需要是至少有一个参数不为空且与输入匹配。

      【讨论】:

        猜你喜欢
        • 2016-10-11
        • 2019-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-05
        • 2012-01-29
        • 2010-12-09
        相关资源
        最近更新 更多