this question, a neat answer about using COALESCE에서 복잡한 논리 트리를 단순화합니다. 나는 단락의 문제를 고려했다.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.
을 나는 오라클 일부 mentionsrelated를 발견했다. SQL Server으로 일부 테스트. 사용자 정의 함수를 포함하면 단락이 발생할 수 있습니다.
그래서이 동작은 ANSI 표준에 의해 보장되어야합니까?
[고 관련] (http://stackoverflow.com/q/7473045/73226) –
를 (,() 1/0를 선택) COALESCE을 선택'의 DBA의 대답을 요약하면 '오류없이 실행되고 그것이 단락되었음을 보여줍니다. 통역사는 이것을 'CASE'라고 짧게 봅니다. –