MySQL에서 필드가 null이면 0을 반환


160

MySQL에서 "total"필드가 NULL 인 경우 0으로 설정하는 방법이 있습니까?

여기 내가 가진 것입니다 :

SELECT uo.order_id, uo.order_total, uo.order_status,
            (SELECT SUM(uop.price * uop.qty) 
             FROM uc_order_products uop 
             WHERE uo.order_id = uop.order_id
            ) AS products_subtotal,
            (SELECT SUM(upr.amount) 
             FROM uc_payment_receipts upr 
             WHERE uo.order_id = upr.order_id
            ) AS payment_received,
            (SELECT SUM(uoli.amount) 
             FROM uc_order_line_items uoli 
             WHERE uo.order_id = uoli.order_id
            ) AS line_item_subtotal
            FROM uc_orders uo
            WHERE uo.order_status NOT IN ("future", "canceled")
            AND uo.uid = 4172;

NULL 필드가 아닌 것을 제외하고는 데이터가 잘 나옵니다 0.

MySQL에서 NULL을 0으로 반환하려면 어떻게해야합니까?

답변:


326

IFNULL 사용 :

IFNULL(expr1, 0)

설명서에서 :

expr1이 NULL이 아닌 경우 IFNULL ()은 expr1을 반환합니다. 그렇지 않으면 expr2를 반환합니다. IFNULL ()은 사용되는 컨텍스트에 따라 숫자 또는 문자열 값을 반환합니다.


IFNULL ((SELECT SUM (uop.price * uop.qty) FROM uc_order_products uop WHERE uo.order_id = uop.order_id) AS products_subtotal, 0)입니까?
케빈

2
@Kevin : 아니오-별명이 끝납니다.
Mark Byers

2
@ MarkByers 주석에서 Kevin의 예제가 왜 틀렸고 실제로 무엇이되어야하는지 보여줄 수 있습니까?
Michael

정말 고맙습니다 !! 이것은 내가 찾던 정확히
brunobliss

@MarkByers IFNOtNULL (expr1, 1) 같은 것이 있습니까
Noni

25

coalesce(column_name,0)그냥 대신 사용할 수 있습니다 column_name. 이 coalesce함수는 목록에서 첫 번째 NULL이 아닌 값을 반환합니다.

이와 같은 행 단위 함수는 일반적으로 확장성에 문제가 있음을 언급해야합니다. 데이터베이스의 크기가 적당하다고 생각되면 추가 열과 트리거를 사용하여 비용을에서로 이동하는 select것이 insert/update좋습니다.

이것은 데이터베이스가 쓰여진 것보다 더 자주 읽히고 (대부분의 경우) 가정하는 비용을 상각합니다.


이는 일주일에 한 번 모든 고객에게 청구됩니다. 데이터는 일주일 내내 기록 된 다음 특정 시간에 계산 및 청구됩니다. 구독 서비스처럼 생각하십시오. 청구 기간의 임기 중에 변경을 수행 할 수 있으며 활동은 적절한 간격으로 청구됩니다.
Kevin

MS SQL은 iSnull이고 MySQL은 iFnull입니다. (MySQLs ISNULL은 MS SQL의 ISNULL과는 다른 기능입니다)
크레이그 제이콥스

11

위의 답변 중 어느 것도 나를 위해 완성되지 않았습니다. 필드 이름 field이이면 선택기는 다음과 같아야합니다.

IFNULL(`field`,0) AS field

예를 들어 SELECT 쿼리에서

SELECT IFNULL(`field`,0) AS field, `otherfield` FROM `mytable`

이것이 누군가가 시간을 낭비하지 않도록 도울 수 있기를 바랍니다.


5

이런 식으로 시도해 볼 수 있습니다

IFNULL(NULLIF(X, '' ), 0)

속성 X가 비어있는 문자열 인 경우 속성 X는 비어있는 것으로 가정 한 후 마지막 값 대신 0으로 선언 할 수 있습니다. 다른 경우에는 원래 값으로 유지됩니다.

어쨌든, 다른 방법으로 그렇게 할 수 있습니다.


이것은 SELECT와 중간 IFNULL (var, 0)의 중간에 아주
효과적이었습니다.

5

예 IFNULL 함수는 원하는 결과를 얻기 위해 작동합니다.

SELECT uo.order_id, uo.order_total, uo.order_status,
        (SELECT IFNULL(SUM(uop.price * uop.qty),0) 
         FROM uc_order_products uop 
         WHERE uo.order_id = uop.order_id
        ) AS products_subtotal,
        (SELECT IFNULL(SUM(upr.amount),0) 
         FROM uc_payment_receipts upr 
         WHERE uo.order_id = upr.order_id
        ) AS payment_received,
        (SELECT IFNULL(SUM(uoli.amount),0) 
         FROM uc_order_line_items uoli 
         WHERE uo.order_id = uoli.order_id
        ) AS line_item_subtotal
        FROM uc_orders uo
        WHERE uo.order_status NOT IN ("future", "canceled")
        AND uo.uid = 4172;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.