【发布时间】:2011-11-29 19:25:20
【问题描述】:
我遇到了这个查询的问题:
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 的文本框。
对不起,我的错误问题,感谢您的建议。
【问题讨论】:
-
您能否根据 value2 是否为空来更改参数化查询?坏情况的查询计划有什么明显的地方吗?
-
感谢您的回答。 Adrian 解决方案工作正常,查询必须验证必要的,而不是像我总是验证的旧查询。
标签: sql sql-server tsql query-optimization