0

私は2つのバージョンで準備されたクエリを持っています.最初のものは機能しますが、CASE WHENを使用する2番目のものは機能しません:

 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

CASE WHEN バージョン :

 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 リファレンス マニュアルで推奨されている構造を正確に使用します。2 番目のクエリが機能しない理由がわかりません。

4

1 に答える 1

2

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
于 2012-04-28T15:20:27.503 に答える