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_name
is 0 - 전체 식의 결과는 NULL입니다.
(다른 집계 함수와 달리) 절대 반환하지 않기 때문에, 당신은 다음을 잡기만 하면 됩니다.0
case(어쨌든 유일하게 문제가 있는 케이스).질문을 단순화했습니다.
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
로.integer
1입니다.
나는 아래의 제안대로 했고 그것은 작동했습니다.
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
'programing' 카테고리의 다른 글
사전을 반환하기 위한 LINQ 쿼리 (0) | 2023.05.13 |
---|---|
스토리보드에서 여러 컨트롤러와 함께 사용할 사용자 지정 셀을 만들려면 어떻게 해야 합니까? (0) | 2023.05.13 |
c#을 사용하여 엑셀 파일에서 데이터를 읽는 방법 (0) | 2023.05.13 |
python에서 xlsxwriter를 사용하여 기존 XLSX 워크북의 셀에 데이터 쓰기/업데이트하는 방법 (0) | 2023.05.13 |
Mongo의 컬렉션을 어떻게 설명해야 합니까? (0) | 2023.05.13 |