2010-07-06 6 views
2

Каким будет лучший способ сделать это?Наличие сформированного столбца зависит от других сгенерированных столбцов

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

Как написано прямо сейчас я получаю invalid column name 'foo' ошибку. Нужно ли вообще делать это, когда оператор select может использоваться как представление?

ответ

2

Вы должны использовать вложенную выбрать так:

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

Проблема что столбец foo не распознается именем в одном и том же предложении select.

1

Вы можете использовать производную таблицу, если вы не хотите повторять определение столбца.

select case when foo='blah' 
    then 'fizz' 
    else 'buzz' 
end as bar 
FROM 
(
select 'blah' as foo 
) derived 

Или КТР

; 
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 
Смежные вопросы