都道府県穴埋めゲーム

SQL SERVER2005を使用しています。
テーブルAがあり、Aが持つフィールド「suuchi」には数値が入っているとします。


suuchiフィールドの値を計算して、その結果が0以上なら計算結果を。負の数なら0を出力するSQL文を書きたいのです。
CASE WHEN を使用して以下のSQLを書きました。

SELECT CASE WHEN ( suuchi*2 + 1 ) < 0 THEN 0 END FROM テーブルA;

しかし、結果は計算結果が負の数の場合は「0」になりますが、0以上の場合が表示されませんでした。
理由は、CASE WHEN でELSEを省略した場合、結果がNULLになるためと思われます。
以下のSQLでは期待とおりの結果が得られます。

SELECT CASE WHEN ( suuchi*2 + 1 ) < 0 THEN 0 ELSE ( suuchi*2 + 1 ) END FROM テーブル;

しかし、同じ計算式を2回書くのは今一正しくないように思えます。
CASE WHEN で計算結果を判断した場合、ELSEでは計算済みの結果を取ることはできないのでしょうか?
上は例として書いたので簡単な計算式ですが、実際私が業務で使用している計算式はかなり長いため
できれば式を2回書くことを避けたいのです(SQL文が長くなるため)。

計算結果に一時的に別名をつけようとして、以下のようなSQL文を書いたのですが「AS 付近にエラーがあります」といわれます。
SELECT CASE WHEN ( suuchi*2 + 1 ) AS TMPFIELD < 0 THEN 0 ELSE TMPFIELD END FROM テーブル;


質問は2点です。
1) 計算式の結果をCASE WHEN で判断した場合、ELSEの時は計算結果を取得したい場合は、再度同じ計算式を書く必要がありますか?
2) 上の答えが「必要ない」場合、上記条件を満たすSQLの書き方をご教示いただけませんでしょうか?


なお、質問文の文章、SQLServerの環境の記述不足、SQL文等で意味不明な箇所がありましたらご指摘ください。
以上です。よろしくお願いします。

A 回答 (1件)

case文を使う場合は、


case when 式1 then 0 else 式1 end
のように、同じ式を書く必要があります。

計算結果がnullになるような場合なら、
coalesce(式1,0)
といった関数を使う方法もありますが、今回は該当しませんね。

式に別名を付けた場合、そのクエリ内でなく、その外側のクエリでなら、別名で操作できます。
select
EX1
from (select *,suuchi*2+1 as EX1 from tbl1) as x
    • good
    • 0
この回答へのお礼

chukenkenkou様、丁寧なご回答ありがとうございます。
前回(SQLServer2005で文字列の時刻の合計を出す方法)に引き続き、今回もご教示いただきまして、本当にありがとうございます。

CASE WHENでは式を2回記述する必要がありますか。
私も本日もう一度調べましたが、そのつど書く以外の回答を見つけられませんでした。

別名のつけ方も教えていただきましてありがとうございました。
試しましたが、既存のSQLに組み込むにはかなりの修正が必要になるため
今回は式を2回各方法を使うことにしました。

chukenkenkou様、何度も助けていただきまして、申し訳ございません。
あと丁寧な回答ありがとうございました。本当に感謝します。
以上です

お礼日時:2007/11/14 23:33

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

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


おすすめ情報