这样做的最佳方式是什么?生成列取决于其他生成的列
select 'blah' as foo,
CASE
WHEN foo='blah' THEN 'fizz'
ELSE 'buzz'
END as bar
正如现在写的,我得到一个invalid column name 'foo'
错误。无论如何要做到这一点的选择陈述可以用作一个视图?
这样做的最佳方式是什么?生成列取决于其他生成的列
select 'blah' as foo,
CASE
WHEN foo='blah' THEN 'fizz'
ELSE 'buzz'
END as bar
正如现在写的,我得到一个invalid column name 'foo'
错误。无论如何要做到这一点的选择陈述可以用作一个视图?
您需要使用嵌套的选择是这样的:
select foo,
case when foo='blah'
then 'fizz'
else 'buzz'
end as bar
from (select 'blah' as foo) a
问题在同一个select语句中,列foo不被名称所识别。
如果您不想重复列定义,则可以使用派生表。下面
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
快速测试显示所有三个版本的执行计划是相同的
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
WITH TmpTbl as (SELECT 'blah' as foo)
SELECT foo, CASE WHEN foo='blah' THEN 'fizz'
ELSE 'buzz'
END as bar FROM TmpTbl