プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (2件)

CASE式でテーブルを切り替えることのできるDBMSはないと思います。


そのためにOracleでもSQL Serverでも苦労して動的クエリを書くのです。

SET @sql='SELECT * FROM '+CASE WHEN @FLG=0 THEN 't当月集計' ELSE 't累積集計' END+' AS t請求残'
EXEC (@sql)
    • good
    • 3

わざわざ性能が出しにくかったり、分かりにくい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
;

この回答への補足

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

補足日時:2009/03/06 15:03
    • good
    • 1
この回答へのお礼

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

お礼日時:2010/10/27 10:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A