我有一个这样的查询:
SELECT Column1, Column2, ...
FROM Table
WHERE (
CASE
WHEN Column1 = 'Value1'
AND Column2 = 'Value2'
THEN 'ok'
ELSE 'nok'
END = 'ok'
)
我知道我可以这样重写条件:
SELECT Column1, Column2, ...
FROM Table
WHERE Column1 = 'Value1'
AND Column2 = 'Value2'
我的问题是,与使用简单条件的查询(示例#2(相比,在WHERE条件下使用CASE语句编写查询(示例#1(是否会对性能产生影响。有时,使用CASE语句(嵌套语句(比使用AND+OR构建相同的条件更容易读取更复杂的条件。我使用Oracle和Microsoft SQL Server。
是。在WHERE
子句中使用CASE
表达式和布尔表达式有很大的区别。
在几乎所有的数据库中;优化器理解布尔表达式";。CASE
表达式要求按照定义它们的顺序对它们进行求值。因此,优化器将只使用表扫描来运行表达式。
这可能会影响索引的使用和优化器的使用。在更复杂的查询中,它可能会对通过算法选择联接或组产生下游影响。
另一个微妙的点是,你可能有这样的表达式没有索引:
where substr(y, 1000, 1002) = 'xyz' and x = 1
其中一个显然比另一个贵。在许多优化器中,在运行更昂贵的函数之前,会知道在x = 1
上进行过滤。
建议避免在WHERE
(和ON
子句(中使用CASE
表达式。在少数情况下需要它们,但应该非常谨慎地使用。