2011-03-30 2 views
3

저는 0으로 나누기를 포함 할 수있는 계산을 수행하고 있습니다.이 경우 결과는 임의의 값 (55)이됩니다. 놀랍게도 case 문으로 계산을 래핑하는 것은 그 일을하지 않았습니다!Netezza는 사례 진술의 게으른 평가를하지 않습니까?

select case when 1=0 then 3/0 else 55 end 

오류 HY000 : 0

이유는 무엇입니까 나누기? 다른 해결 방법이 있습니까?

+0

어쩌면 상수 폴딩을합니다. 실제 데이터를 반대로 시도하면 어떻습니까? (비슷한 일은 SQL 서버에서 'select case with 1 = 0, LOG (0) else 55 end') –

+0

일 가능성이 있습니다.이 오류는 상수 때문일 수 있습니다. 나는 진짜 질문을 게시 할 것이다. – ihadanny

답변

4

괜찮 았어. 이것은 "0으로 나누기"와 함께 실패 정확한 쿼리입니다 :

select case when min(baba) = 0 then 55 else sum(1/baba) end from t group by baba

이 그 I 그룹 baba에 의해 통지로, Netezza를 밖으로 게으른 평가 실패처럼 보이는, 그래서 바바는 0, 그것은 또한 때마다 min(baba)이 0임을 의미하며, 1/baba 용어에 도달하지 않고 0으로 나누지 않고 평가가 정상적으로 중지되어야합니다. 맞습니까? 음 ... 아니.

여기에 나와있는 이유와 실패 이유는입니다. Netezza는 집계 용어를 평가하기 전에 행 용어를 평가합니다. 그래서 모든 행에 1/babababa을 평가해야하며, 단지 그것은 집계 용어 min(baba)

sum(1/baba) 때문에, (나를 위해) 해결했다 평가할 수 : select case when min(baba) = 0 then 55 else 1/min(baba) end from t group by baba, 같은 의미를 갖습니다.

+1

Netezza 쿼리 처리에 대한 이해에서 볼 때 집계는 호스트의 "가시성"/ "FPGA 후 엔진 제한"후에 수행됩니다. 이렇게하면 쿼리가 실패하는 이유와 왜 볼 때 rbr 단위로 행을 평가하고 처리하는지 설명 할 수 있습니다. 해결 방법에서 쿼리를 작성한 방법에서 집계 후에 적용하여 Netezza의 "호스트"부분으로 해당 처리를 이동 한 것으로 보입니다. – cairnz