programing

Postgre에서 0으로 나눗셈을 피함SQL

powerit 2023. 5. 13. 11:02
반응형

Postgre에서 0으로 나눗셈을 피함SQL

SELECT 조항에서 나눗셈을 수행하고 싶습니다.일부 테이블을 결합하고 집계 함수를 사용할 때 null 또는 0 값을 구분 기호로 사용하는 경우가 많습니다.현재로서는 0과 null 값으로 나눗셈을 피하는 이 방법만 생각해냅니다.

(CASE(COALESCE(COUNT(column_name),1)) WHEN 0 THEN 1
ELSE (COALESCE(COUNT(column_name),1)) END) 

더 좋은 방법이 없을까요?

NULLIF 함수를 사용할 수 있습니다.

something/NULLIF(column_name,0)

값이 다음과 같다면,column_nameis 0 - 전체 식의 결과는 NULL입니다.

(다른 집계 함수와 달리) 절대 반환하지 않기 때문에, 당신은 다음을 잡기만 하면 됩니다.0case(어쨌든 유일하게 문제가 있는 케이스).질문을 단순화했습니다.

CASE count(column_name)
   WHEN 0 THEN 1
   ELSE count(column_name)
END

더 단순하게, 더 단순하게, 그리고NULLIF()유리가 제공한 대로.

집계 기능에 대한 설명서 인용:

주의해야 할 것은 다음을 제외하고는count이러한 함수는 행을 선택하지 않은 경우 null 값을 반환합니다.

이것이 오래된 질문이라는 것을 알지만, 또 다른 해결책은 최고의 기능을 사용하는 것입니다.

greatest( count(column_name), 1 )  -- NULL and 0 are valid argument values

참고:제가 선호하는 것은 어윈과 유리의 대답처럼 NULL을 반환하거나 값을 감지하여 논리적으로 해결하는 것입니다.0분할 작업 전, 그리고 복귀.0그렇지 않으면 다음을 사용하여 데이터가 잘못 표시될 수 있습니다.1.

1로 대체하여 0으로 분할하는 것을 방지하는 또 다른 솔루션

select column + (column = 0)::integer;

카운트가 0일 때 분할기를 1로 설정하려면 다음을 수행합니다.

count(column_name) + 1 * (count(column_name) = 0)::integer

출연진은true로.integer1입니다.

나는 아래의 제안대로 했고 그것은 작동했습니다.

column_name / COALESCE(NULLIF(column_name,0), 1)

심지어 asum기능은 다음과 같이 작동할 수 있습니다.

 (
sum(column_name) :: decimal / COALESCE(
  NULLIF(sum(other_column_name) :: decimal, 0),1) :: decimal * 100
)

언급URL : https://stackoverflow.com/questions/17681375/avoid-division-by-zero-in-postgresql

반응형