2009-10-18 7 views
30

Est-il possible d'aliaser un nom de colonne, puis de l'utiliser dans une instruction CASE? Par exemple,SQL: nom de colonne d'alias à utiliser dans l'instruction CAS

SELECT col1 as a, CASE WHEN a = 'test' THEN 'yes' END as value FROM table; 

Je suis en train de créer un alias de la colonne parce qu'en fait ma déclaration de cas serait généré par programme, et je veux la colonne que la déclaration de cas utilise pour spécifier dans le SQL au lieu d'avoir à passer un autre paramètre au programme.

Répondre

28

Je pense que MySql et MsSql ne le permettront pas car ils essaieront de trouver toutes les colonnes de la clause CASE sous forme de colonnes o f les tables de la clause WHERE.

Je ne sais pas ce que vous SGBD parlez, mais je suppose que vous pourriez faire quelque chose comme ça dans tous les SGBD:

SELECT *, CASE WHEN a = 'test' THEN 'yes' END as value FROM (
    SELECT col1 as a FROM table 
) q 
0

Pas dans MySQL. Je l'ai essayé et je reçois l'erreur suivante:

ERROR 1054 (42S22): Unknown column 'a' in 'field list'
0

ni dans MSSQL

SELECT col1 AS o, e = CASE WHEN o < GETDATE() THEN o ELSE GETDATE() END 
FROM Table1 

Retours:

Msg 207, Level 16, State 3, Line 1 
Invalid column name 'o'. 
Msg 207, Level 16, State 3, Line 1 
Invalid column name 'o'. 

Cependant, si je change à CASE QUAND col1 ... ALORS col1 il fonctionne

47

Ce:

SELECT col1 as a, 
     CASE WHEN a = 'test' THEN 'yes' END as value 
    FROM table; 

... sera pas travail. Ce sera :

SELECT CASE WHEN a = 'test' THEN 'yes' END as value 
    FROM (SELECT col1 AS a 
      FROM TABLE) 

Pourquoi vous pas utiliser:

SELECT t.col1 as a, 
     CASE WHEN t.col1 = 'test' THEN 'yes' END as value 
    FROM TABLE t; 

... Je ne sais pas.

+1

Ceci devrait être marqué comme la bonne réponse! – erbaker

1

J'utilise des CTE pour aider à composer des requêtes SQL complexes, mais tous les SGBDR ne les prennent pas en charge. Vous pouvez les considérer comme des vues d'étendue de requête. Voici un exemple dans t-sql sur le serveur SQL.

With localView1 as (
select c1, 
     c2, 
     c3, 
     c4, 
     ((c2-c4)*(3))+c1 as "complex" 
    from realTable1) 
    , localView2 as (
select case complex WHEN 0 THEN 'Empty' ELSE 'Not Empty' end as formula1, 
     complex * complex as formula2  
    from localView1) 
select * 
from localView2 
+1

La syntaxe WITH est prise en charge dans Oracle 9i +, SQL Server 2005+ et DB2 (version dunno). Dans le cas d'Oracle & SQL Server, la syntaxe WITH est juste une alternative aux vues en ligne. –

0
  • Si vous écrivez seule condition égale juste: Select columns1 Case Lorsque 0 Then 'Valeur1' quand 1 puis 'Valeur2' else 'Unknown' End

  • Si vous voulez écrire plus, moins ou égal, vous devez faire comme ceci: Select Case Lorsque [ColumnsName]> 0 Then 'valeur1' Quand [ColumnsName] = 0 ou [ColumnsName] < 0 puis 'valeur2' Else 'Unkownvalue' End

De tablename

Merci M.Buntha Khin

0
SELECT 
    a AS [blabla a], 
    b [blabla b], 
    CASE c 
     WHEN 1 THEN 'aaa' 
     WHEN 2 THEN 'bbb' 
     ELSE 'unknown' 
    END AS [my alias], 
    d AS [blabla d] 
FROM mytable 
1

Cela devrait fonctionner. Essayez cette

Select * from 
       (select col1, col2, case when 1=1 then 'ok' end as alias_col 
       from table) 
     as tmp_table 
order by 
     case when @sortBy = 1 then tmp_table.alias_col end asc 
2

@OMG Ponies - Un de mes raisons de ne pas utiliser le code suivant

SELECT t.col1 as a, 
    CASE WHEN t.col1 = 'test' THEN 'yes' END as value 
FROM TABLE t; 

peut être que le t.col1 n'est pas une colonne réelle dans le tableau. Par exemple, il peut être une valeur d'une colonne XML comme

Select XMLColumnName.value('(XMLPathOfTag)[1]', 'varchar(max)') 
as XMLTagAlias from Table 
-4

le rendre si facile.

select columnnameshow = (CASE tipoventa 
when 'CONTADO' then 'contadito' 
when 'CREDITO' then 'cred' 
else 'no result' 
end) from Promocion.Promocion 
Questions connexes