【发布时间】: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