0

条件付き引数に基づいて、2 つの異なるテーブルから同じ列を取得しようとしています。

そのため、これまであまり使用していなかった CASE ステートメントに出くわしました。これはこの方法でうまくいくことがわかりましたが、1つの CASE ステートメントを実行してから、列ごとに実行するのではなく、必要な列を選択できればいいのにと思います。

これは私が持っていて働いているものの例ですが、少し冗長に思えます。

SELECT TOP(10)
    u1.userid as userid,
    version = CASE
        WHEN (u2.userid IS NULL OR u1.enabled = 0)
        THEN 3
        ELSE 4
    END,
    nameOrg = CASE
        WHEN (u2.userid IS NULL OR u1.enabled = 0)
        THEN CONVERT(NVARCHAR, u1.title)
        ELSE CONVERT(NVARCHAR, u2.title)
    END,
    nameContact = CASE
        WHEN (u2.userid IS NULL OR u1.enabled = 0)
        THEN CONVERT(NVARCHAR, u1.contact)
        ELSE CONVERT(NVARCHAR, u2.contact)
    END,
    pltName = CASE
        WHEN (u2.userid IS NULL OR u1.enabled = 0)
        THEN p1.name
        ELSE p2.name
    END
FROM
    usr1 u1
LEFT OUTER JOIN
    usr2 u2
    ON u1.userid = u2.userid
LEFT OUTER JOIN
    plt2 p2
    ON u2.pltid = p2.pltid
LEFT OUTER JOIN
    plt1 p1
    ON u1.pltid = p1.pltid

何かアドバイスはありますか?

  • 編集 mov 7、5:22: 必要な機能を追加するために、plt テーブルと pltName ケースに結合を追加しました。
4

1 に答える 1

0

usr2 データセットに一致するユーザー ID がない場合、すべてのフィールドが null になります。以下で行ったように、 isnull 関数を使用して少し冗長にすることもできますが、1 行にはなりません。

SELECT TOP(10)
    u1.userid as userid
    ,version = CASE
        WHEN (u2.userid IS NULL OR u1.enabled = 0)
        THEN 3
        ELSE 4
    END 
    ,CONVERT(NVARCHAR,isnull(u2.title,u1.title)) nameOrg
    ,CONVERT(NVARCHAR,isnull(u2.contact,u1.contact)) nameContact
FROM
    usr1 u1
LEFT OUTER JOIN
    usr2 u2
ON u1.userid = u2.userid
于 2012-11-07T21:53:00.630 に答える