>source

이것은 저를 항상 좌절하게 만들고 모든 종류의 특수 code를 외우도록 강요하며 제 쿼리가 필요 이상으로 추악해지게 만드는 수많은 작은 세부 사항 중 하나입니다.

크기에 대해 다음 쿼리를 시도하십시오.

SELECT sum(amount) FROM table WHERE conditions;

기록을 찾을 수 없는 경우합집합()그 양은 0 대신 empty/null/undefined를 반환하므로 내 애플리케이션에서 출력이 0의 "합계" 대신 예기치 않게 비어 있게 됩니다. 하지만합집합()"합"을 의미하므로 0을 반환하지 않는 이유는 무엇입니까?

해결책을 알고 있습니다. 당신은 "단순히"다음을 수행합니다.

SELECT COALESCE(sum(amount), 0) FROM table WHERE conditions;

이제 레code가 없어도 0을 반환합니다. 그러나 그것은 추악하고 더 이상 사용하기에 "재미" 느끼지 않습니다. 데이터베이스가 "재미있는 게임"이 되어야 한다는 것은 아니지만, 제 말의 의미를 알 수 있습니다. 쿼리가 너무 복잡하거나 "추한" 경우 더 이상 사용하는 것이 만족스럽지 않습니다. 특히 이것이 모든 종류의 장소에서 반복되며 그것은 단지 불분명하고 일회성인 경우가 아닙니다.

이렇게 행동하게 만드는 사고 과정은 무엇이었습니까? 나는 관련된 다른 많은 문제가 있습니다없는, 그러나 나는 이 질문에 대해 한 가지에 집중할 것입니다.

"무"의 합은 "무"(알 수 없음)가 0이 아니기 때문에

a_horse_with_no_name2022-01-15 07:27:13

SQL 표준 위원회가 그렇게 결정했기 때문에 ;)

ypercubeᵀᴹ2022-01-15 07:27:13

@a_horse_with_no_name 빈 집합의 합은 수학에서 가장 일반적으로 0으로 정의됩니다. SQL 위원회는 다른 것을 결정했습니다 ...

ypercubeᵀᴹ2022-01-15 07:27:13

@ypercubeᵀᴹ: 비어 있음은 "알 수 없음"(=null)과 다릅니다. 수학에는 "알 수 없음/NULL"이라는 개념이 없습니다.

a_horse_with_no_name2022-01-15 07:27:13

알아요. 그러나 조건이 행을 합으로 제한하면 본질적으로 빈 행 집합에 대해 합산합니다.

ypercubeᵀᴹ2022-01-15 07:27:13
  • 이전 postgresql : 마이그레이션으로 DB에 데이터 추가
  • 다음 mysql.user 테이블이 갑자기 손상됨