Karmaşık mantık ağaçlarını basitleştirmek için this question, a neat answer about using COALESCE'dan. Kısa devre problemini düşündüm. Örneğin, birçok dilde fonksiyonlarda, argümanlar tamamen değerlendirilir ve daha sonra işleve iletilir. C: görünmüyorCOALESCE - kısa devre garantili mi?
int f(float x, float y) {
return x;
}
f(a, a/b) ; // This will result in an error if b == 0
SQL Server COALESCE
"fonksiyonu" bir sınırlama olması:
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
Payda = 0, ben beklenebilir zaman ikinci davayı değerlendiren olsaydı Şöyle bir hata için:
Msg 8134, Level 16, State 1, Line 1
Divide by zero error encountered.
Ben Oracle bazı mentionsrelated bulundu. Ve SQL Server ile bazı testler. Kullanıcı tanımlı işlevleri dahil ettiğinizde kısa devrenin bozulabileceği anlaşılıyor.
Bu davranış, ANSI standardı tarafından garanti edilmek zorunda mı?
[Yüksek İlgili] (http://stackoverflow.com/q/7473045/73226) –
((), 1/0 SEÇ 1) COALESCE SEÇİMİ 'DBA cevap özetlemek için' hatasız çalışır ve kısa devre olduğunu gösterir. Tercüman bunu kısaltılmış bir "CASE" ifadesi olarak görüyor. –