9

ストアド プロシージャを作成しようとしていますが、特定の列の値に応じて、選択するテーブルを変更できるようにしたいと考えています。例を挙げてみましょう:

SELECT ItemNumber,
       ItemType, 
       Description
FROM

CASE ItemType
WHEN 'A' THEN TableA
ELSE TableB
END

WHERE 

CASE ItemType
WHEN 'A' THEN ItemNumber = @itemNumber
ELSE PartNumber = @itemNumber
END

ご覧のとおり、選択したテーブルを動的に変更しているだけでなく、これら 2 つのテーブルは 2 人の異なる人物によって 2 つの異なる時期に作成されたため、列名も異なります。

だから、私の質問は次のとおりです。これを達成するための最良の方法は何ですか。SQL Server は私が作成したクエリを気に入らないようです。

私がやろうとしていることを見ている人がこれを行うためのより良い方法を提案できるなら、私はすべての耳になります:-)

4

6 に答える 6

6

FROM 句で CASE ステートメントを使用することはできませんが、代わりに次のステートメントを使用できます。

SELECT itemnumber, itemtype, description
  FROM tablea
 WHERE itemnumber = @itemnumber AND itemtype = 'A'
UNION ALL
SELECT itemnumber, itemtype, description
  FROM tableb
 WHERE partnumber = @itemnumber AND itemtype <> 'A'
于 2009-01-29T18:02:44.517 に答える
4

動的 SQL ステートメントを文字列として構築し、sp_executesql ストアド プロシージャを呼び出して文字列を実行することもできます。

詳細と例については、こちらを参照してください。

于 2009-01-29T17:35:18.300 に答える
4

なぜあなたが1つのSQLステートメントで物事をやりたいのかわかりません..私はSQL Serverの人ではありませんが、Oracleストアドプロシージャでは次のようなものを書くことができます.

If itemtype = 'A' 
Then 
 <statement for table A>
Else
 <statement for Table B>
End if

このようなものは、SQL Serverでも機能するはずです..誰かがこれを拡張できるでしょうか?

于 2009-01-29T18:42:36.307 に答える
1

あなたは本当にどこItemTypeから来たのかを説明していません。UNION2 つのテーブルを単純に結合する場合は、提案どおりに適用できる可能性があります。

あなたの問題に関連する可能性がある別の可能性は次のとおりです。

SELECT ItemNumber,
       ItemType, 
       COALESCE(TableA.Description, TableB.Description) AS Description
FROM Items
LEFT JOIN TableA
    ON Items.ItemType = 'A'
    AND TableA.ItemNumber = Items.ItemNumber
LEFT JOIN TableB
    ON Items.ItemType <> 'A'
    AND TableB.ItemNumber = Items.ItemNumber
于 2009-01-29T17:40:36.197 に答える
0

最初に UNION クエリを使用してテーブルを結合し、次に SELECT を使用することをお勧めします。

また、いずれかのテーブルのビューを作成することを検討してください。これにより、名前を変更して必要な列のみをプルし、次に UNION を作成し、次に UNION から選択します。

または、一時テーブルを使用して、各クエリの結果を保存します。一時テーブルの作成をケースに入れます(疑似コード、テストされていません):

CASE @itemType
   WHEN 'A'
      SELECT ACol1 AS Col1, ACol2 AS Col2
      FROM TABLE_A
      INTO #tempTable
      WHERE ItemNumber = @itemNumber
   ELSE
      SELECT BCol1 AS Col1, BCol2 AS Col2
      FROM TABLE_B
      INTO #tempTable
      WHERE PartNumber = @itemNumber
END

SELECT * FROM #tempTable
于 2009-01-29T17:35:10.950 に答える