MySQL BOŞ DEĞİLSE, ardından 1 göster, yoksa 0 göster


105

Burada küçük bir ekran komplikasyonu ile çalışıyorum. Eminim sadece gözden kaçırdığım bir EĞER / ELSE yeteneği vardır.

Sorguladığım 2 tablom var (müşteriler, adresler). İlki ana kayda sahiptir, ancak ikincisi LEFT JOIN'e kayıt olabilir veya olmayabilir.

Adres tablosunda kayıt yoksa sıfır görüntülemek istiyorum. Ve bir kayıt varsa yalnızca 1 görüntülemek istiyorum.

Şimdiye kadar denediğim şey:

SELECT c.name, COALESCE(a.addressid,0) AS addressexists
FROM customers c
LEFT JOIN addresses a ON c.customerid = a.customerid
WHERE customerid = 123

Bu ilk örnek bunu yapmaz. Ama COALESCE'ı yanlış kullanıyor olabilirim.

Bir şey varsa, 0, boşsa ve 1'i nasıl görüntüleyebilirim?


Yanıtlar:


212

Bunun yerine şunu COALESCE(a.addressid,0) AS addressexistskullanın CASE:

CASE WHEN a.addressid IS NOT NULL 
       THEN 1
       ELSE 0
END AS addressexists

veya daha basit:

(a.addressid IS NOT NULL) AS addressexists

Bunun nedeni çalışır TRUEgörüntülenir 1MySQL ve FALSEolduğu gibi 0.


97
SELECT c.name, IF(a.addressid IS NULL,0,1) AS addressexists
FROM customers c
LEFT JOIN addresses a ON c.customerid = a.customerid
WHERE customerid = 123

17

C / C ++ 'dan geliyorsanız ve bunun çalışmasını bekliyorsanız dikkatli olun:

select if(name, 1, 0) ..

'Name' NULL olmasa bile, C'den farklı olarak, bir yanlış koşul hala tetiklenir ve yukarıdaki ifade 0'ı döndürür. Bu nedenle, NULL veya boş dizeyi açıkça kontrol etmeyi hatırlamanız gerekir:

 select if(name is null or name = '', 0, 1)

PS Eugen'in yukarıdaki örneği doğru , ancak bu nüansı beni şaşırttığı için açıklığa kavuşturmak istedim.


16
SELECT 
    c.name, 
    CASE WHEN a.addressid IS NULL THEN 0 ELSE 1 END AS addressexists
FROM customers c
LEFT JOIN addresses a ON c.customerid = a.customerid
WHERE customerid = 123

2

WHERE olmadan başka bir yöntem, şunu deneyin ..

Hem Boş hem de NULL değerleri seçecek

SELECT ISNULL(NULLIF(fieldname,''))  FROM tablename

Boş bir dizge ise null atar, o zaman bunun için de doğru olur.


Ayrıca yararlıdır: tablename'den IFNULL (alan adı, "1") seçin;
PodTech.io

1

MySQL'in son sürümlerinde bir IF deyimi kullanabilirsiniz.

IF(expr,if_true_expr,if_false_expr)

IE:

SELECT name, IF(ISNULL(name), 'robot', 'human') AS type
FROM visitors

0

TSQL dahilindeyse şunları deneyebilirsiniz:

SELECT IIF(a.addressid IS NULL, 0, 1) AS addressexists

SQL Server çalışmalıdır

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.