web-dev-qa-db-ja.com

MySQL IF NULLではない場合は1を表示し、そうでない場合は0を表示します

私はここで小さなディスプレイの複雑さに取り組んでいます。見落としているIF/ELSE機能があると確信しています。

クエリを実行する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を表示するにはどうすればよいですか?

94
coffeemonitor

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で1として表示され、FALSE0として表示されるためです。

185
ypercubeᵀᴹ
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
84
Eugen Rieck

C/C++から来て、これが機能することを期待している場合は注意してください:

select if(name, 1, 0) ..

Cとは異なり、「名前」がNULLでなくても、偽条件がトリガーされ、上記のステートメントは0を返します。したがって、NULLまたは空の文字列を明示的にチェックすることを忘れないでください。

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

PS 上記のEugenの例は正しい ですが、このニュアンスを明確にしたかったのは驚きでした。

16
Slawomir
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
13
bucko

WHEREを使用しない別の方法、これを試してください。

空の値とNULL値の両方を選択します

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

空の文字列の場合はnullを設定し、それに対してもtrueになります。

2
PodTech.io

TSQL内であれば、次を試すことができます。

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

SQL Serverは動作するはずです

0
Kevin Chen

実際には、MySQLの最新バージョンでIFステートメントを使用できます。

IF(expr,if_true_expr,if_false_expr)

IE:

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