ケース espressionの値が常にtrueに評価されている場合、そのステートメントを持つ必要はありません。
しかし、私はケースの使用方法は間違っていると思います。それは以下のようなものでなければなりません。 ON の条件にケースを含めることはできますが、JOINにはありません。これにより、条件に基づいて異なる列に結合することができます。
これは構文的には正しいですが、出力の内容が不明です。
あなたは、このリンクを使用して、この文を検証することができますInstant SQL Formatter
クエリ:
SELECT mFrom.user_name AS sender_name,
mp.message AS message
FROM msg_pv mp
INNER JOIN membresmvc
ON (
CASE mp.from_type
WHEN "mb" THEN mFrom.id = mp.id_from
ELSE NULL
END
)
WHERE mp.id_to = :id_member;
UPDATE
あなたは条件に基づいて複数のテーブルを結合するために必要がある場合は、あなたが必要としますLEFT OUTER JOIN
を使用します。あなたのクエリは、2番目のテーブルには、* second_table *で、別の値がここ
がそれを示している例である「別の値」
SELECT COALESCE(mFrom.user_name, second_table.some_col) AS sender_name,
mp.message AS message
FROM msg_pv mp
LEFT OUTER JOIN membresmvc
ON mFrom.id = mp.id_from
AND mp.from_type = "mb"
LEFT OUTER JOIN second_table
ON second_table.id = mp.id_from
AND mp.from_type = "another value"
WHERE mp.id_to = :id_member;
例であると仮定すると、このようになります。このスクリプトは、SQL Server 2012データベースでテストされています。 MySQLでは異なるかもしれません。しかし、LEFT OUTER JOINの概念はMySQLでも同じです。
- あり、3つのテーブル、すなわち
table1
、table2
とtable3
- ここでは、以下の条件に基づいて、表2と表3の両方でTABLE1に参加する必要があります。
- に参加
constant
場合に表2にCOL2とTABLE1でをcolrefid TABLE1値T2を有しています。
- に参加し
constant
場合に表3にCOL3でTABLE1でをcolrefid TABLE1値T3を持っています。
- あなたは最後にあなたの要件に応じてテーブルを結合するためのアイデアを提供します
希望の出力を見ることができます。
スクリプト:
CREATE TABLE dbo.Table1
(
col1 INT NOT NULL
, colrefid INT NOT NULL
, constant VARCHAR(10) NOT NULL
);
CREATE TABLE dbo.Table2
(
col2 INT NOT NULL
, name VARCHAR(10) NOT NULL
);
CREATE TABLE dbo.Table3
(
col3 INT NOT NULL
, name VARCHAR(10) NOT NULL
);
INSERT INTO dbo.Table1 (col1, colrefid, constant) VALUES
(123, 2, 't2'),
(784, 3, 't3'),
(498, 2, 't2');
INSERT INTO dbo.Table2 (col2, name) VALUES
(2, 'table 2');
INSERT INTO dbo.Table3 (col3, name) VALUES
(3, 'table 3');
SELECT t1.col1
, t1.colrefid
, t1.constant
, COALESCE(t2.col2, t3.col3) colvalue
, COALESCE(t2.name, t3.name) colname
FROM dbo.Table1 t1
LEFT OUTER JOIN dbo.Table2 t2
ON t2.col2 = t1.colrefid
AND t1.constant = 't2'
LEFT OUTER JOIN dbo.Table3 t3
ON t3.col3 = t1.colrefid
AND t1.constant = 't3';
出力:私はあなたがそこにケースを使用することができるとは思わない
col1 colrefid constant colvalue colname
---- -------- -------- -------- -------
123 2 t2 2 table 2
784 3 t3 3 table 3
498 2 t2 2 table 2
(私はSQLには専門家です)。また、そのケースにマッチしないときに何が起こると思いますか? – Mat
このケースは常に一致します。mp.from_typeの値は常にテーブル内で "mb"ですが、なぜ動作しないのか分かりません。 SQLでCASE WHENが機能するかどうかを確認したい。 – Anon
使い方に同意して、http://www.mysqldiary.com/conditional-joins-in-mysql/をチェックしてください。 – GDP