0

我有两个版本的准备好的查询,第一个有效,但第二个使用 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”。我完全使用MySQL 参考手册中推荐的结构。我不明白为什么第二个查询不起作用。

4

1 回答 1

2

如果您的CASE espression 值始终评估为 true,则无需使用该语句。

但是,我认为CASE在您的查询中的使用是错误的。它应该如下所示。您可以在 ON条件下使用CASE ,但不能在JOIN本身上使用 CASE。这样,您可以根据条件加入不同的列。

这在语法上是正确的,但不确定输出是什么。

您可以使用此链接验证此语句: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 中也是相同的。

  • 有三个表,table1table2table3
  • 在这里,我们必须根据以下条件将 table1 与 table2 和 table3 连接起来。
  • 如果table1中的colrefid具有值t2 ,则将table1中的colrefidtable2中的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
于 2012-04-28T15:20:27.503 回答