2010-07-06 71 views
2

这样做的最佳方式是什么?生成列取决于其他生成的列

select 'blah' as foo, 
     CASE 
      WHEN foo='blah' THEN 'fizz' 
      ELSE 'buzz' 
     END as bar 

正如现在写的,我得到一个invalid column name 'foo'错误。无论如何要做到这一点的选择陈述可以用作一个视图?

回答

2

您需要使用嵌套的选择是这样的:

select foo, 
    case when foo='blah' 
    then 'fizz' 
    else 'buzz' 
    end as bar 
from (select 'blah' as foo) a 

问题在同一个select语句中,列foo不被名称所识别。

1

如果您不想重复列定义,则可以使用派生表。下面

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] 
0

你可能使用一个表查询,像这样:

select a.foo, 
    case when a.foo = 'blah' 
    then 'fizz' 
    else 'buzz' 
    end as bar 
from (select 'blah' as foo) a 
1
WITH TmpTbl as (SELECT 'blah' as foo) 
SELECT foo, CASE WHEN foo='blah' THEN 'fizz' 
      ELSE 'buzz' 
      END as bar FROM TmpTbl