2009-10-18 59 views
30

¿Es posible alias un nombre de columna y luego usar eso en una instrucción CASE? Por ejemplo,SQL: Alias ​​Nombre de columna para uso en la instrucción CASE

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

estoy tratando de ser alias de la columna, porque en realidad mi instrucción CASE se generaría mediante programación, y quiero que la columna que la sentencia case utiliza que se especificarán en el SQL en lugar de tener que pasar a otro parámetro al programa

Respuesta

28

Creo que MySql y MsSql no permitirán esto porque tratarán de encontrar todas las columnas en la cláusula CASE como columnas o f las tablas en la cláusula WHERE.

No sé qué DBMS que está hablando, pero yo supongo que se podría hacer algo como esto en cualquier DBMS:

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

No en MySQL. Lo probé y me sale el siguiente error:

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

Ni en MsSql

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

devoluciones:

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

Sin embargo si cambio al caso cuando col1 ... ENTONCES col1 se trabajos

47

Este:

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

... se no trabajo. Esto hará :

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

¿Por que no se usará:

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

... no sé.

+1

¡Esto debe marcarse como la respuesta correcta! – erbaker

1

Utilizo CTE para ayudar a redactar consultas SQL complicadas, pero no todos los RDBMS las soportan. Puede pensar en ellos como vistas de alcance de consulta. Aquí hay un ejemplo en t-sql en el servidor 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

CON sintaxis es compatible con Oracle 9i +, SQL Server 2005+ y DB2 (versión dunno). En el caso de Oracle y SQL Server, la sintaxis WITH es solo una alternativa a las vistas en línea. –

0
  • Si se escribe solamente igual condición simplemente: Seleccionar columns1 caso cuando 0 entonces 'valor1' cuando 1 entonces 'Valor2' otra cosa 'Desconocido' Fin

  • Si desea escribir mayor, menor o igual que debe hacerlo de esta manera: Select Case Cuando [ColumnsName]> 0 entonces 'valor1' Cuando [ColumnsName] = 0 o [ColumnsName] < 0 entonces 'valor2' Else 'Unkownvalue' Fin

De nombredetabla

Gracias Mr.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

Debería funcionar. Prueba este

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

los potros @OMG - Una de mis razones de no usar el código

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

siguiente puede ser que el t.col1 no es una columna en la tabla. Por ejemplo, puede ser un valor de una columna XML como

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

hacen que sea tan fácil.

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