我有这样的疑问:
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 条件(示例#1)中使用 CASE 语句编写查询是否会对性能产生任何影响。有时,使用 CASE 语句(嵌套语句)比使用 AND+OR 构建相同的条件更具可读性。我使用 Oracle 和 Microsoft SQL Server。
是的。 在
CASE
子句中使用 WHERE
表达式和布尔表达式之间有一个非常非常大的区别。
在几乎所有数据库中,这都归结为“优化器理解布尔表达式”。
CASE
表达式要求按照定义的顺序对它们进行求值。 因此,优化器将仅使用表扫描并运行表达式。
这可能会影响索引的使用和优化器的使用。 它可以在更复杂的查询中对连接或分组算法的选择产生下游影响。
另一个微妙的点是,你可以有这样的未索引的表达式:
where substr(y, 1000, 1002) = 'xyz' and x = 1
其中一个显然比另一个更贵。 许多优化器都知道在运行更昂贵的函数之前要过滤
x = 1
。
建议避免在
CASE
(和 WHERE
子句)中使用 ON
表达式。 在少数情况下需要它们,但应非常谨慎地使用它们。