【发布时间】:2010-10-05 02:14:20
【问题描述】:
从this question、a neat answer about using COALESCE 简化复杂的逻辑树。我考虑过短路的问题。
例如,在大多数语言的函数中,参数都经过完全评估,然后传递给函数。在 C 中:
int f(float x, float y) {
return x;
}
f(a, a / b) ; // This will result in an error if b == 0
这似乎不是 SQL Server 中 COALESCE“函数”的限制:
CREATE TABLE Fractions (
Numerator float
,Denominator float
)
INSERT INTO Fractions VALUES (1, 1)
INSERT INTO Fractions VALUES (1, 2)
INSERT INTO Fractions VALUES (1, 3)
INSERT INTO Fractions VALUES (1, 0)
INSERT INTO Fractions VALUES (2, 0)
INSERT INTO Fractions VALUES (3, 0)
SELECT Numerator
,Denominator
,COALESCE(
CASE WHEN Denominator = 0 THEN 0 ELSE NULL END,
CASE WHEN Numerator <> 0 THEN Numerator / Denominator ELSE NULL END,
0
) AS TestCalc
FROM Fractions
DROP TABLE Fractions
如果它在分母 = 0 时评估第二种情况,我预计会看到如下错误:
Msg 8134, Level 16, State 1, Line 1
Divide by zero error encountered.
我在 Oracle 上找到了一些 mentions related。还有一些使用SQL Server 的测试。当您包含用户定义的函数时,看起来短路可能会发生故障。
那么,这种行为是否应该由 ANSI 标准来保证?
【问题讨论】:
-
总结 DBA 的答案,
SELECT COALESCE(1, (SELECT 1/0))运行没有错误,并显示它短路。解释器将其视为缩短的CASE语句。
标签: sql sql-server tsql coalesce short-circuiting