Наличие сгенерированного столбца зависит от других сгенерированных столбцов - PullRequest
2 голосов
/ 06 июля 2010

Каков наилучший способ сделать это?

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

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

Ответы [ 4 ]

2 голосов
/ 06 июля 2010

Вам нужно использовать вложенный выбор, например:

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

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

1 голос
/ 06 июля 2010
WITH TmpTbl as (SELECT 'blah' as foo)
SELECT foo, CASE WHEN foo='blah' THEN 'fizz' 
            ELSE 'buzz' 
            END as bar FROM TmpTbl
1 голос
/ 06 июля 2010

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

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 голосов
/ 06 июля 2010

Вы можете использовать табличный запрос, например, так:

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