我在执行此查询时遇到问题:
SELECT col1, col2,col3,...,coln FROM MyTable
WHERE col1 = @value1
AND
(
ISNULL(col2,'c') = ISNULL(@value2,ISNULL(col2,'c'))
OR
ISNULL(col3,'c') = ISNULL(@value2,ISNULL(col3,'c'))
)
AND coln = 'valueN'
我必须停止执行,它太慢了。但编辑:
SELECT col1, col2,col3,...,coln FROM MyTable
WHERE col1 = @value1
AND
(
ISNULL(col2,'c') = ISNULL(@value2,ISNULL(col2,'c'))
)
AND coln = 'valueN'
此查询速度更快。有人能帮我吗?如何替换 or 语句或替换查询但验证 col1 和 col2? 谢谢。
更新:
非常感谢你们。实际上,我的查询不使用“=”,而是使用“Like”,对此感到抱歉。不过,我使用您的建议来构建我的查询,并且效果很好:
SELECT col1, col2,col3,...,coln FROM MyTable
WHERE col1 like '%' + @value1 + '%'
AND
(
(@value2 IS NULL)
OR
(col2 IS NOT NULL AND col2 LIKE '%' + @value2 + '%')
OR
(col3 IS NOT NULL AND col3 LIKE '%' + @value2 + '%')
)
AND coln = 'valueN'
我在一个页面上使用此查询,其中有许多字段来过滤搜索,并且我需要将 col2 文本框也应用于数据库中的 col3,我的意思是,数据库中只有一个用于 name1 和 name2 的文本框。
很抱歉我的问题有误,感谢您的建议。
最佳答案
ISNULL(col2,'c') = ISNULL('value2',ISNULL(col2,'c'))
与
相同col2 = 'value2' or (col2 is null and 'value2' is null)
替换出现的情况,您很可能会获得更好的性能。
更新
此解决方案与 @onedaywhen 提出的解决方案有一个根本区别:当 'value2'
中提供的值(我认为只是组装成 SQL 字符串的参数)为 NULL
,OP只想返回col2为NULL的记录。仔细看看OP的逻辑,你就会发现这一点。 OP的逻辑总是过滤:当参数为NULL
时,OP想要col2为NULL
的记录。
@onedaywhen 的解决方案在参数为 NULL
时带来每条记录。虽然这是一个非常常见的查询,但这不是 OP 正在寻找的内容。
关于sql - 如何优化此查询(OR 内部 AND 验证)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8316520/