我有一个准备好的查询有两个版本,第一个有效但第二个使用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
msg_pv表中mp.from_type的值始终为“mb”。我完全使用the structure recommented in the MySQL reference manual。我不明白为什么第二个查询不起作用。
答案 0 :(得分:2)
如果您的 CASE 表达式值始终评估为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
。假设您的第二个表是* 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
和table3
希望能让您根据自己的要求加入表格。
脚本:
constant
输出:
constant