ฉันจะให้ฟังก์ชัน SUM ใน MySQL คืนค่า '0' ได้อย่างไรหากไม่พบค่าใด ๆ


150

ว่าฉันมีฟังก์ชั่นง่าย ๆ ใน MySQL:

SELECT SUM(Column_1)
FROM Table
WHERE Column_2 = 'Test'

หากไม่มีรายการในColumn_2 มีข้อความ 'Test' แล้วฟังก์ชันนี้จะส่งคืนNULLในขณะที่ฉันต้องการให้ส่งคืน 0

ฉันทราบว่าคำถามที่คล้ายกันได้ถูกถามสองสามครั้งที่นี่ แต่ฉันไม่สามารถปรับคำตอบให้ตรงตามวัตถุประสงค์ของฉันได้ดังนั้นฉันจึงขอขอบคุณสำหรับความช่วยเหลือในการเรียงลำดับ


คำตอบ:


305

ใช้COALESCEเพื่อหลีกเลี่ยงผลลัพธ์นั้น

SELECT COALESCE(SUM(column),0)
FROM   table
WHERE  ...

หากต้องการดูในทางปฏิบัติโปรดดูซอ sql นี้: http://www.sqlfiddle.com/#!2/d1542/3/0


ข้อมูลมากกว่านี้:

ให้สามตาราง (หนึ่งที่มีตัวเลขทั้งหมด, หนึ่งที่มี null ทั้งหมดและหนึ่งที่มีการผสม):

ซอ Fiddle

การติดตั้ง Schema ของ MySQL 5.5.32 :

CREATE TABLE foo
(
  id    INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  val   INT
);

INSERT INTO foo (val) VALUES
(null),(1),(null),(2),(null),(3),(null),(4),(null),(5),(null),(6),(null);

CREATE TABLE bar
(
  id    INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  val   INT
);

INSERT INTO bar (val) VALUES
(1),(2),(3),(4),(5),(6);

CREATE TABLE baz
(
  id    INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  val   INT
);

INSERT INTO baz (val) VALUES
(null),(null),(null),(null),(null),(null);

แบบสอบถาม 1 :

SELECT  'foo'                   as table_name,
        'mixed null/non-null'   as description,
        21                      as expected_sum,
        COALESCE(SUM(val), 0)   as actual_sum
FROM    foo
UNION ALL

SELECT  'bar'                   as table_name,
        'all non-null'          as description,
        21                      as expected_sum,
        COALESCE(SUM(val), 0)   as actual_sum
FROM    bar
UNION ALL

SELECT  'baz'                   as table_name,
        'all null'              as description,
        0                       as expected_sum,
        COALESCE(SUM(val), 0)   as actual_sum
FROM    baz

ผลลัพธ์ :

| TABLE_NAME |         DESCRIPTION | EXPECTED_SUM | ACTUAL_SUM |
|------------|---------------------|--------------|------------|
|        foo | mixed null/non-null |           21 |         21 |
|        bar |        all non-null |           21 |         21 |
|        baz |            all null |            0 |          0 |

2
ขอบคุณแบรด มันทำงานได้ดีมาก
Nick

1
ไม่ได้เลือก SUM (IFNULL (คอลัมน์, 0)) จากกลุ่มตารางตามสิ่งที่ถูกต้องมากกว่านี้ ถ้าเรามีค่า IS NULL และค่าจริงบางอย่างใน "คอลัมน์"
DarkSide

2
@ DarkSide: ไม่มีอะไรที่คาดไม่ถึง
แบรดคริสตี้

@BradChristie ใช่คุณพูดถูก SUM ทำงานได้ดีกับค่า NULL เช่นกัน
DarkSide

1
โปรดทราบว่าในขณะที่SUMทำงานได้ตามต้องการAVGและCOUNTสามารถให้ผลลัพธ์ที่แตกต่างกันเมื่อได้รับข้อความNULLแจ้งให้คุณใช้COALESCEตามที่แนะนำโดย @DarkSide ขึ้นอยู่กับผลลัพธ์ที่คุณต้องการ
fyrye

65

ใช้IFNULLหรือCOALESCE:

SELECT IFNULL(SUM(Column1), 0) AS total FROM...

SELECT COALESCE(SUM(Column1), 0) AS total FROM...

ความแตกต่างระหว่างพวกเขาคือIFNULLส่วนขยาย MySQL ที่รับสองอาร์กิวเมนต์และCOALESCEเป็นฟังก์ชัน SQL มาตรฐานที่สามารถรับหนึ่งอาร์กิวเมนต์ขึ้นไป เมื่อคุณมีเพียงสองข้อโต้แย้งที่ใช้IFNULLจะเร็วขึ้นเล็กน้อยถึงแม้ว่าที่นี่ความแตกต่างจะไม่มีความสำคัญเนื่องจากมันจะถูกเรียกเพียงครั้งเดียว


3
@ ทำเครื่องหมายอะไรคือความแตกต่าง b / w IFNULLหรือCOALESCE?? คุณอธิบายได้มั้ย
mo sean

1
PS สำหรับทุกคนที่ทำงานกับ Postgres coalesceจะสนับสนุนเท่านั้น
Siddhartha

4

ไม่สามารถรับสิ่งที่คุณต้องการได้อย่างแน่นอน แต่ถ้าคุณใช้ฟังก์ชัน SUM รวมซึ่งหมายความว่าคุณกำลังจัดกลุ่มตาราง

ข้อความค้นหาใช้สำหรับ MySQL เช่นนี้

Select IFNULL(SUM(COLUMN1),0) as total from mytable group by condition

คุณจัดกลุ่มตามเงื่อนไข แต่ไม่ส่งคืน (คุณจะได้รับเงื่อนไขที่ไม่รู้จักจำนวนมาก)?
Lluis Martinez
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.