varchar列是否包含可选的关键字范围

时间:2016-01-29 12:03:40

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

我有以下查询,其中我选择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。返回的数据量大且不正确。

如果我删除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 + '%'))

但是如果一个子句有一个null变量,比如关键字3,那么我会返回数百行

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

我应该使用Contains而不是LIKE吗?

你能在条件中看到我的逻辑错误吗?

2 个答案:

答案 0 :(得分:4)

你的逻辑是正确的,但不是你想要的。如果你使用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将返回true。这是你想要的逻辑。

答案 1 :(得分:2)

@keyword1 IS NULL OR crm_cache.search_string LIKE ('%' + @keyword1 + '%')
  • 如果@keyword1为NULL,则无论其他检查是什么,整个条件都将为真,因为它都是OR s。所有其他变量都相同。

你需要这个:

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

...对于每个变量,与现在的OR组合在一起。但逻辑必须是至少有一个参数不为null并与输入匹配。