CASE espression の値が常に true と評価される場合、そのステートメントは必要ありません。
ただし、クエリでのCASEの使用法は間違っていると思います。以下のようになるはずです。ON条件でCASEを使用できますが、 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;
アップデート
条件に基づいて複数のテーブルに結合する必要がある場合は、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 でも同じです。
table1
、 、table2
およびの 3 つのテーブルがあります。table3
- ここでは、以下の条件に基づいて、table1 と table2 および table3 の両方を結合する必要があります。
- table1の値がt2の場合、table1のcolrefidをtable2のcol2と結合します。
constant
- table1の値がt3の場合、table1のcolrefidをtable3のcol3と結合します。
constant
- 最後に出力を見ることができます
要件に従ってテーブルに参加するためのアイデアが得られることを願っています.
スクリプト:
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