我有以下查询,其中我选择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吗?
你能在条件中看到我的逻辑错误吗?
答案 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并与输入匹配。