Hiçbir değer bulunmazsa MySQL'de TOPLA işlevinin '0' değerini döndürmesini nasıl sağlayabilirim?


150

Diyelim ki MySQL'de basit bir fonksiyonum var:

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

Column_2'de hiçbir giriş 'Test' metnini içermiyorsa, bu işlev 0 döndürmesini NULListerken bu işlev geri döner .

Benzer bir sorunun burada birkaç kez sorulduğunun farkındayım, ancak cevapları amacımla uyarlayamadım, bu yüzden bunu sıralamak için bazı yardımlar için minnettar olurum.


Yanıtlar:


305

COALESCEBu sonucu önlemek için kullanın .

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

Çalışırken görmek için lütfen şu sql kemanına bakın: http://www.sqlfiddle.com/#!2/d1542/3/0


Daha fazla bilgi:

Üç tablo verildi (biri tüm sayılarla, biri tüm null'larla ve biri karışımla):

SQL Keman

MySQL 5.5.32 Şema Kurulumu :

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);

Sorgu 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

Sonuçlar :

| 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
Teşekkürler Brad. Bu işi güzel yapıyor.
Nick

1
TOPUM SEÇ (EĞER (sütun, 0)) tablo GRUP TARAFINDAN daha doğru bir şey değil mi? "Sütun" da bazı IS NULL değerleri ve bazı gerçek değerlerimiz varsa ne olur?
DarkSide

2
@DarkSide: Kesinlikle beklenmedik bir şey yok .
Brad Christie

@BradChristie evet kesinlikle haklısın. SUM da NULL değerleri ile iyi çalışıyor.
DarkSide

1
Ederken lütfen unutmayın SUMişlevini yapar istediğiniz gibi, AVGve COUNTolabilir farklı sonuçlar alırken NULLkullanmak Prompting COALESCEistediğiniz sonuca göre, @DarkSide tarafından önerildiği gibi.
fyrye

65

IFNULLVeya kullanın COALESCE:

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

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

Aralarındaki fark IFNULL, iki argüman alan bir MySQL uzantısıdır ve COALESCEbir veya daha fazla argüman alabilen standart bir SQL işlevidir. Sadece iki argümanınız IFNULLolduğunda, biraz daha hızlı olsa da, burada fark sadece bir kez çağrıldığı için önemsizdir.


3
@ Fark nedir b / w IFNULLveya COALESCE?? açıklayabilir misin ??
mo sean

1
PS. Postgres ile çalışan herkes için yalnızca desteklenir coalesce.
Siddhartha

4

Tam olarak sorduğunuz şey alınamıyor, ancak tabloyu grupladığınızı ima eden bir toplam TOPLA işlevi kullanıyorsanız.

Sorgu böyle MYSQL için gidiyor

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

Koşula göre gruplandırıyorsunuz, ancak iade etmiyorsunuz (bir sürü bilinmeyen koşul alacaksınız)?
Lluis Martinez
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.