私はここで小さなディスプレイの複雑さに取り組んでいます。見落としている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を表示するにはどうすればよいですか?
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
として表示され、FALSE
が0
として表示されるためです。
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
C/C++から来て、これが機能することを期待している場合は注意してください:
select if(name, 1, 0) ..
Cとは異なり、「名前」がNULLでなくても、偽条件がトリガーされ、上記のステートメントは0を返します。したがって、NULLまたは空の文字列を明示的にチェックすることを忘れないでください。
select if(name is null or name = '', 0, 1)
PS 上記のEugenの例は正しい ですが、このニュアンスを明確にしたかったのは驚きでした。
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
WHEREを使用しない別の方法、これを試してください。
空の値とNULL値の両方を選択します
SELECT ISNULL(NULLIF(fieldname,'')) FROM tablename
空の文字列の場合はnullを設定し、それに対してもtrueになります。
TSQL内であれば、次を試すことができます。
SELECT IIF(a.addressid IS NULL, 0, 1) AS addressexists
SQL Serverは動作するはずです
実際には、MySQLの最新バージョンでIFステートメントを使用できます。
IF(expr,if_true_expr,if_false_expr)
IE:
SELECT name, IF(ISNULL(name), 'robot', 'human') AS type
FROM visitors