2011-04-18 15 views
32

a2.date seçmek istiyorum, ancak NULL ise a1.date (a2 bırakıldı) seçmek istiyorum. Bu:Diğeri boşsa, bir sütun SELECT

SELECT a2.date OR a1.date 
     ... 

Basitçe olsa boş olmayan sütunun gerçek değerini nasıl elde edersiniz, (bir beklendiği gibi) bir boolean bir sonuç döndürür? (a2.date tercih edilir, ancak sıfır ise

+0

[Conditional NOT NULL case SQL] 'nin olası kopyası (http://stackoverflow.com/questions/4821031/conditional-not-null-case-sql) – nawfal

cevap

82

COALESCE kullanmaktır:

SELECT COALESCE(a2.date, a1.date) AS `date` 
    ... 

MySQL doğal sözdizimi IFNULL olup: COALESCE farklı

SELECT IFNULL(a2.date, a1.date) AS `date` 
    ... 

, IFNULL diğer veritabanları taşınabilir değildir. Düzgün çalışmak için daha fazla yön gerektirir, ancak şartlar değişirse daha esnektir

SELECT CASE 
     WHEN a2.date IS NULL THEN a1.date 
     ELSE a2.date 
     END AS `date` 
    ... 

:

Başka ANSI sözdizimi

, CASE expression, bir seçenektir.

+0

'COALESCE' eşdeğer" CASE "ifadesi için sözdizimsel şekere sahiptir Bu yüzden burada bahsetmek gereksizdir. Bir benzetme kullanmak için, tüm SQL kısıtlamaları bir 'SELECT COUNT (*)' (cardinality) sorgusu kullanılarak ifade edilebilir, ancak bunu her bir cevapta işaret ettiysem, bir "FOREIGN KEY" kelimesini kullandıysam, tüm ilgililer için ihtiyatlı hale gelebilir. Ama bunun için bir düşüş, biraz sert olurdu. – onedaywhen

+1

@OMGPonies: Downvoters hakkında endişelenme - ya da daha güncel ifadelerle, "haters nefret edecek." –

4

Seçim için bir CASE statement kullanın.

SELECT CASE WHEN a2.date IS NULL THEN a1.date 
    ELSE a2.date END AS mydate 
5

COALESCE işlevine göz atın.

Değişken sayıda argüman alır ve ilk sıfır olmayanı döndürür. Bu birleşimleri ile iyi çalışıyor. ANSI anlamına

3
SELECT COALESCE(a2.date, a1.date) ...