2012-02-22 6 views
73

私はここで少し複雑な問題を解決しています。 IF/ELSEの機能があることは間違いないと思います。MySQL IF NOT NULL、表示1、そうでなければ0表示

私は(顧客、住所)を照会している2つのテーブルを持っています。最初のレコードにはメインレコードがありますが、2番目のレコードにはLEFT JOINへのレコードがある場合とない場合があります。

アドレステーブルにレコードがない場合はゼロを表示します。 レコードが存在する場合は、1だけを表示します。

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

この最初の例では、それをしない:私はこれまで試みられてきた何

。しかし、私はCOALESCEを間違って利用しているかもしれません。

nullが存在する場合は0を表示し、存在する場合は1を表示するにはどうすればよいですか?

+0

[条件付きNOT NULLの場合のSQLの可能な複製](http://stackoverflow.com/questions/4821031/conditional-not-null-case-sql) – nawfal

答えて

154

代わりのCOALESCE(a.addressid,0) AS addressexistsは、CASEを使用します。

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

または単純:

(a.addressid IS NOT NULL) AS addressexists 

TRUEがMySQLで10などFALSEとして表示されるので、これは動作します。

+19

+1の(a.addressid IS NOT NULL)AS addressexists – Simon

+0

完璧、ありがとう – Vignesh

+0

これは私の人生を保存してくれてありがとう! –

12
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 
72
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 
14

慎重に、あなたは、C/C++から来て仕事にこれを期待している場合:

select if(name, 1, 0) .. 

'名前' はC、偽の条件とは異なり、NULLでない場合でも、まだトリガされ、上記の文はこのように0を返し、明示的にNULLまたは空の文字列をチェックするために覚えている:

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

PS Eugen's example up above is correctですが、このニュアンスが私を驚かせてくれるのを明らかにしたかったのです。

1

は空とNULLは、それはそれは空の文字列である場合、また、その上で真ではnullに設定します

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

値の両方を選択します。これを試してみてくださいWHEREせずに別の方法。

+0

また、tablenameからIFNULL(fieldname、 "1")を選択すると便利です。 – Hariboo

関連する問題