2013-07-04 2 views
2

나는 SQLServer를 오랫동안 사용 해왔고, 실제로 시도하기 전에 문자열 값에 유효한 날짜가 포함되어 있는지 확인하는 등의 일을 할 수있는 lazy evaluation을 사용하여 CASE 표현식에 대한 아이디어를 얻었습니다 그것을 변환하십시오.case in SQL

오늘 나는 이것이 사실이 아닌 것처럼 보이는 시나리오를 발견했습니다. 내가 기대하는 것처럼

select b, sum(case when b<> 0 then a/b end) 
from (
    select 1 as a, 1 as b union select 1, 0 union select 0, 1 
) x group by b 

이 잘 작동 : 일부 단순화 한 후,이 (계산에 어떤 의미 그냥 바보 예를 찾으려고하지 않음)을 표시 할 수있는 쉬운 예입니다.

select b, case when b<> 0 then sum(a/b) end 
from (
    select 1 as a, 1 as b union select 1, 0 union select 0, 1 
) x group by b 

오류 (제로가 나옴)가 표시됩니다.

집계 함수와 관련이있는 것으로 보입니다. 어쨌든 합계는 사례가 나오기 전에 평가되지만, 무엇인가를 놓치고 있어야하며 무엇을 모르는 것이 좋습니다.

몇 가지 해결 방법이 있으며 실제 문제가 없으므로이 문제에 대해 대부분 궁금합니다.

그런데 필자는 SQLServer2005와 SQLServer2008에서 테스트 한 다음 오라클 11g에서 항상 동일한 결과를 테스트했습니다.

답변

2

두 번째 버전에서는 전체 결과 집합에 행 당 조건이 없기 때문에 집계 sum(a/b)을 계산해야합니다. 그런 다음 각 행은 CASE 표현식을 사용하여 해당 값을 포함할지 여부를 결정합니다.