我有两个准备好的查询,第一个版本有效,但第二个使用 CASE WHEN 不起作用:
SELECT mFrom.user_name AS sender_name, mp.message AS message
FROM msg_pv mp
INNER JOIN membresmvc AS mFrom
ON mp.id_from = mFrom.id
WHERE mp.id_to = :id_member
版本案例:
SELECT mFrom.user_name AS sender_name, mp.message AS message
FROM msg_pv mp
INNER JOIN
CASE mp.from_type
WHEN "mb" THEN membresmvc AS mFrom ON mFrom.id = mp.id_from
END -- also tried "END CASE"
WHERE mp.id_to = :id_member
mp.from_type的值在msg_pv表中始终为"mb"。我完全使用了MySQL参考手册中重新注释的结构。我不明白为什么第二个查询不起作用。
如果您的 CASE 抑制值的计算结果始终为 true,则无需使用该语句。
但是,我认为在您的查询中使用 CASE 是错误的。它应该是如下所示的。您可以将 CASE 置于 ON 条件,但不能在 JOIN 本身上。这样,您可以根据条件加入不同的列。
这在语法上是正确的,但不确定输出是什么。
您可以使用以下链接验证此语句:即时 SQL 格式化程序
查询:
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
。假设第二个表是 *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 中可能有所不同。但是,即使在MySQL中,这里使用的左外连接的概念也是相同的。
- 有三个表,即
table1
、table2
和table3
- 在这里,我们必须根据以下条件将表1与表2和表3连接起来。 如果表 1 中的 colrefid 具有
- 值 t2
constant
,则将表 1 中的 colrefid 与表 2 中的 col2 连接起来。 - 如果表 1 中的 colrefid 具有值 t3
constant
,则将表 1 中的 colrefid 与表 3 中的 col3 连接起来。 - 您可以在末尾看到输出
希望这能让您有一个想法,根据您的要求加入表格。
脚本:
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