sql - 如何优化此查询(OR 内部 AND 验证)?

标签 sql sql-server t-sql query-optimization

我在执行此查询时遇到问题:

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/

相关文章:

mysql - 如何删除mysql中的外键?

sql - 从 SQL Server 表生成 INSERT 语句

SQL Server 计算列的元数据

sql - 如何从连接表 SQL 的列中排除另一个值

sql - AWS Athena中的嵌套查询替代方案

sql - 有条件地从多个表加入

sql-server - 通过分隔符分割多个字段

sql - 计算 SQL Server 中排除某些行的运行计数

mysql - 选择带有条件的别名以计入mysql中的百分比

c# - 如何使用 EF Code First 有效地初始化大型种子?