これを行う最良の方法は何ですか?
select 'blah' as foo,
CASE
WHEN foo='blah' THEN 'fizz'
ELSE 'buzz'
END as bar
今書いているように、invalid column name 'foo'
エラーが発生します。selectステートメントをビューとして使用できる場所でこれを行う方法はありますか?
これを行う最良の方法は何ですか?
select 'blah' as foo,
CASE
WHEN foo='blah' THEN 'fizz'
ELSE 'buzz'
END as bar
今書いているように、invalid column name 'foo'
エラーが発生します。selectステートメントをビューとして使用できる場所でこれを行う方法はありますか?
次のようにネストされた選択を使用する必要があります。
select foo,
case when foo='blah'
then 'fizz'
else 'buzz'
end as bar
from ( select 'blah' as foo ) a
問題は、列 foo が同じ select ステートメント内の名前で認識されないことです。
WITH TmpTbl as (SELECT 'blah' as foo)
SELECT foo, CASE WHEN foo='blah' THEN 'fizz'
ELSE 'buzz'
END as bar FROM TmpTbl
列の定義を繰り返したくない場合は、派生テーブルを使用できます。
select case when foo='blah'
then 'fizz'
else 'buzz'
end as bar
FROM
(
select 'blah' as foo
) derived
またはCTE
;
With blahs As
(
select 'blah' as foo
)
select case when foo='blah'
then 'fizz'
else 'buzz'
end as bar
FROM blahs
簡単なテストでは、以下の 3 つのバージョンすべての実行計画が同じであることを示しています
SELECT foo,
CASE
WHEN foo='blah'
THEN 'fizz'
ELSE 'buzz'
END AS bar
FROM ( SELECT
CASE
WHEN [number] % 5 = 0
THEN 'blah'
ELSE 'notblah'
END AS foo
FROM [master].[dbo].[spt_values]
)
D ;
WITH blahs AS
( SELECT
CASE
WHEN [number] % 5 = 0
THEN 'blah'
ELSE 'notblah'
END AS foo
FROM [master].[dbo].[spt_values]
)
SELECT foo,
CASE
WHEN foo='blah'
THEN 'fizz'
ELSE 'buzz'
END AS bar
FROM blahs
SELECT
CASE
WHEN [number] % 5 = 0
THEN 'blah'
ELSE 'notblah'
END AS foo,
CASE
WHEN
CASE
WHEN [number] % 5 = 0
THEN 'blah'
ELSE 'notblah'
END='blah'
THEN 'fizz'
ELSE 'buzz'
END AS bar
FROM [master].[dbo].[spt_values]
次のようなテーブルクエリを使用できます。
select a.foo,
case when a.foo = 'blah'
then 'fizz'
else 'buzz'
end as bar
from (select 'blah' as foo) a