programing

반환된 값이 null인 경우 postgresql이 0을 반환합니다.

showcode 2023. 5. 25. 22:15
반응형

반환된 값이 null인 경우 postgresql이 0을 반환합니다.

avg(가격)를 반환하는 쿼리가 있습니다.

  select avg(price)
  from(
      select *, cume_dist() OVER (ORDER BY price desc) from web_price_scan
      where listing_Type='AARM'
        and u_kbalikepartnumbers_id = 1000307
        and (EXTRACT(Day FROM (Now()-dateEnded)))*24 < 48
        and price>( select avg(price)* 0.50
                    from(select *, cume_dist() OVER (ORDER BY price desc)
                         from web_price_scan
                         where listing_Type='AARM'
                           and u_kbalikepartnumbers_id = 1000307
                           and (EXTRACT(Day FROM (Now()-dateEnded)))*24 < 48
                        )g
                   where cume_dist < 0.50
                 )
        and price<( select avg(price)*2
                    from( select *, cume_dist() OVER (ORDER BY price desc)
                          from web_price_scan
                          where listing_Type='AARM'
                            and u_kbalikepartnumbers_id = 1000307
                            and (EXTRACT(Day FROM (Now()-dateEnded)))*24 < 48
                        )d
                    where cume_dist < 0.50)
     )s

  having count(*) > 5

사용 가능한 값이 없을 경우 0을 반환하는 방법은 무엇입니까?

합종연횡을 부리다

COALESCE(value [, ...])
The COALESCE function returns the first of its arguments that is not null.  
Null is returned only if all arguments are null. It is often
used to substitute a default value for null values when data is
retrieved for display.

편집

다음은 의 예입니다.COALESCE질문과 함께:

SELECT AVG( price )
FROM(
      SELECT *, cume_dist() OVER ( ORDER BY price DESC ) FROM web_price_scan
      WHERE listing_Type = 'AARM'
        AND u_kbalikepartnumbers_id = 1000307
        AND ( EXTRACT( DAY FROM ( NOW() - dateEnded ) ) ) * 24 < 48
        AND COALESCE( price, 0 ) > ( SELECT AVG( COALESCE( price, 0 ) )* 0.50
                                     FROM ( SELECT *, cume_dist() OVER ( ORDER BY price DESC )
                                           FROM web_price_scan
                                           WHERE listing_Type='AARM'
                                             AND u_kbalikepartnumbers_id = 1000307
                                             AND ( EXTRACT( DAY FROM ( NOW() - dateEnded ) ) ) * 24 < 48
                                         ) g
                                    WHERE cume_dist < 0.50
                                  )
        AND COALESCE( price, 0 ) < ( SELECT AVG( COALESCE( price, 0 ) ) *2
                                     FROM( SELECT *, cume_dist() OVER ( ORDER BY price desc )
                                           FROM web_price_scan
                                           WHERE listing_Type='AARM'
                                             AND u_kbalikepartnumbers_id = 1000307
                                             AND ( EXTRACT( DAY FROM ( NOW() - dateEnded ) ) ) * 24 < 48
                                         ) d
                                     WHERE cume_dist < 0.50)
     )s
HAVING COUNT(*) > 5

임호COALESCE와 함께 사용하면 안 됩니다.AVG값을 수정하기 때문입니다. NULL알 수 없음을 의미합니다.에 사용하는 것과는 다릅니다.SUM이 예에서, 만약 우리가 교체한다면,AVG타고SUM결과가 왜곡되지 않습니다.합계에 0을 더하는 것은 아무도 해치지 않지만 알 수 없는 값에 대해 0으로 평균을 계산하면 실제 평균을 얻을 수 없습니다.

그렇다면, 저는 덧붙이겠습니다.price IS NOT NULLWHERE이러한 알 수 없는 값을 방지하는 절입니다.

(이 답변은 원래 질문에 사례별 세부 정보를 모두 포함하지 않고 질문에 대해 더 짧고 일반적인 예를 제공하기 위해 추가되었습니다.)


여기에는 두 가지 별개의 "문제"가 있습니다. 첫 번째는 테이블이나 하위 쿼리에 행이 없는 경우이고 두 번째는 쿼리에 NULL 값이 있는 경우입니다.

내가 테스트한 모든 버전에서 postgres 및 mysql은 평균을 낼 때 모든 NULL 값을 무시하고, 평균을 초과할 항목이 없으면 NULL을 반환합니다.NULL은 "알 수 없음"으로 간주되므로 이는 일반적으로 타당합니다.이를 재정의하려면 Luc M이 제안한 대로 병합을 사용할 수 있습니다.

$ create table foo (bar int);
CREATE TABLE

$ select avg(bar) from foo;
 avg 
-----

(1 row)

$ select coalesce(avg(bar), 0) from foo;
 coalesce 
----------
        0
(1 row)

$ insert into foo values (3);
INSERT 0 1
$ insert into foo values (9);
INSERT 0 1
$ insert into foo values (NULL);
INSERT 0 1
$ select coalesce(avg(bar), 0) from foo;
      coalesce      
--------------------
 6.0000000000000000
(1 row)

물론, "from foo"는 "from..."로 대체될 수 있습니다.여기서 어떤 복잡한 논리라도...) foo로서."

이제 테이블의 NULL 행을 0으로 계산해야 합니까?그런 다음 병합은 평균 통화 내부에서 사용해야 합니다.

$ select coalesce(avg(coalesce(bar, 0)), 0) from foo;
      coalesce      
--------------------
 4.0000000000000000
(1 row)

이를 위한 두 가지 방법을 생각해 볼 수 있습니다.

  • IFNULL():

    식이 NULL이면 IFNULL() 함수가 지정된 값을 반환합니다. 식이 NULL이 아니면 이 함수가 식을 반환합니다.

구문:

IFNULL(expression, alt_value)

쿼리를 사용한 IFNULL()의 예:

SELECT AVG( price )
FROM(
      SELECT *, cume_dist() OVER ( ORDER BY price DESC ) FROM web_price_scan
      WHERE listing_Type = 'AARM'
        AND u_kbalikepartnumbers_id = 1000307
        AND ( EXTRACT( DAY FROM ( NOW() - dateEnded ) ) ) * 24 < 48
        AND IFNULL( price, 0 ) > ( SELECT AVG( IFNULL( price, 0 ) )* 0.50
                                     FROM ( SELECT *, cume_dist() OVER ( ORDER BY price DESC )
                                           FROM web_price_scan
                                           WHERE listing_Type='AARM'
                                             AND u_kbalikepartnumbers_id = 1000307
                                             AND ( EXTRACT( DAY FROM ( NOW() - dateEnded ) ) ) * 24 < 48
                                         ) g
                                    WHERE cume_dist < 0.50
                                  )
        AND IFNULL( price, 0 ) < ( SELECT AVG( IFNULL( price, 0 ) ) *2
                                     FROM( SELECT *, cume_dist() OVER ( ORDER BY price desc )
                                           FROM web_price_scan
                                           WHERE listing_Type='AARM'
                                             AND u_kbalikepartnumbers_id = 1000307
                                             AND ( EXTRACT( DAY FROM ( NOW() - dateEnded ) ) ) * 24 < 48
                                         ) d
                                     WHERE cume_dist < 0.50)
     )s
HAVING COUNT(*) > 5
  • COALESCE()

    COALESCE() 함수는 목록에서 null이 아닌 첫 번째 값을 반환합니다.

구문:

COALESCE(val1, val2, ...., val_n)

쿼리를 사용한 COALESCE()의 예:

SELECT AVG( price )
FROM(
      SELECT *, cume_dist() OVER ( ORDER BY price DESC ) FROM web_price_scan
      WHERE listing_Type = 'AARM'
        AND u_kbalikepartnumbers_id = 1000307
        AND ( EXTRACT( DAY FROM ( NOW() - dateEnded ) ) ) * 24 < 48
        AND COALESCE( price, 0 ) > ( SELECT AVG( COALESCE( price, 0 ) )* 0.50
                                     FROM ( SELECT *, cume_dist() OVER ( ORDER BY price DESC )
                                           FROM web_price_scan
                                           WHERE listing_Type='AARM'
                                             AND u_kbalikepartnumbers_id = 1000307
                                             AND ( EXTRACT( DAY FROM ( NOW() - dateEnded ) ) ) * 24 < 48
                                         ) g
                                    WHERE cume_dist < 0.50
                                  )
        AND COALESCE( price, 0 ) < ( SELECT AVG( COALESCE( price, 0 ) ) *2
                                     FROM( SELECT *, cume_dist() OVER ( ORDER BY price desc )
                                           FROM web_price_scan
                                           WHERE listing_Type='AARM'
                                             AND u_kbalikepartnumbers_id = 1000307
                                             AND ( EXTRACT( DAY FROM ( NOW() - dateEnded ) ) ) * 24 < 48
                                         ) d
                                     WHERE cume_dist < 0.50)
     )s
HAVING COUNT(*) > 5

언급URL : https://stackoverflow.com/questions/11007009/postgresql-return-0-if-returned-value-is-null

반응형