• ベストアンサー

FROM の中で CASE を使えるでしょうか

http://msdn.microsoft.com/ja-jp/library/ms181765.aspx …などを見ますと、どうもできそうに無いと思いますが、質問させて頂きます。 例えば、 SELECT * FROM (CASE WHEN @FLG=0 THEN t当月集計 ELSE t累積集計 END) AS t請求残 …のように、FROMの中でCASEが使えると便利なときがあります。 エラーが出ますが、このような書き方はできないのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

CASE式でテーブルを切り替えることのできるDBMSはないと思います。 そのためにOracleでもSQL Serverでも苦労して動的クエリを書くのです。 SET @sql='SELECT * FROM '+CASE WHEN @FLG=0 THEN 't当月集計' ELSE 't累積集計' END+' AS t請求残' EXEC (@sql)

その他の回答 (1)

回答No.1

わざわざ性能が出しにくかったり、分かりにくいSQLにしたいのでしょうか? RDBMSは、ここのカテゴリ通りSQL Serverですか? バージョンは? SQL Serverであれば、T-SQLのIF文で制御すればいいのでは? <例1> declare @flag int; set @flag=1; if @flag=1 select * from t1 else if @flag=2 select * from t2 ; また、SQL Server以外といったことがあるなら、unionを使うといった方法もあります。 <例2> declare @flag int; set @flag=1; select * from t1 where @flag=1 union select * from t2 where @flag=2 ;

kistune
質問者

お礼

代替案ではなく、質問に直接答えて頂きたいところでした。

kistune
質問者

補足

>わざわざ性能が出しにくかったり、分かりにくいSQLにしたいのでしょうか? もちろん、そんなことはありません。 また、例にあげていただいている二つの書き方があることは、勿論存じております。そこを、敢えて質問なので御座居ます。例ではSELECT * ですが、列を列挙しているような場合、スクリプトの量では2倍程度になってしまいますよね。 RDBMSは、ここのカテゴリ通りSQL Serverです。 バージョンは、2000,2005,2008を考えています。

関連するQ&A