2010-07-06 5 views
2

Quelle serait la meilleure façon de procéder?Avoir une colonne générée dépend des autres colonnes générées

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

Comme il est écrit en ce moment je reçois une erreur invalid column name 'foo'. Y at-il de toute façon à faire cela où l'instruction select pourrait être utilisée comme vue?

Répondre

2

Vous devez utiliser un imbriquée sélectionner comme ceci:

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

Le problème est que la colonne foo n'est pas reconnue par le nom dans la même instruction select.

1

Vous pouvez utiliser une table dérivée si vous ne souhaitez pas répéter la définition de colonne.

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

Ou un CTE

; 
With blahs As 
(
select 'blah' as foo 
) 


select case when foo='blah' 
    then 'fizz' 
    else 'buzz' 
end as bar 
FROM blahs 

Un test rapide montre le plan d'exécution pour les trois versions ci-dessous sont les mêmes

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

Vous pourriez utiliser une requête de table comme ceci:

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