2009-10-18 742 views
30

是否可以为列名称设置别名,然后在CASE语句中使用该名称?例如,SQL:在CASE语句中使用别名列名称

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

我想别名列,因为其实我的CASE语句将程序生成的,我想是case语句使用在SQL中指定,而不必通过其他参数列到程序。

回答

28

我认为MySql和MsSql不会允许这样做,因为他们会尝试查找CASE子句中的所有列作为列o f WHERE子句中的表。

我不知道是什么数据库管理系统,你在说什么,但我想你可以做这样的事情在任何DBMS:

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

不在MySQL中。我尝试了,我得到了以下错误:

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

也不在MSSQL中

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

返回:

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

但是如果我改变CASE WHEN COL1 ... THEN COL1它作品

47

此:

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

...将不是工作。这

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

为什么你不会使用:

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

...我不知道。

+1

这应该被标记为正确答案! – erbaker 2012-02-22 19:22:47

1

我使用CTE来帮助组合复杂的SQL查询,但不是所有的RDBMS都支持它们。您可以将它们视为查询范围视图。这是SQL服务器上的t-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

WITH语法在Oracle 9i +,SQL Server 2005+和DB2(不支持版本)中受支持。在Oracle和SQL Server的情况下,WITH语法只是内联视图的替代方法。 – 2009-10-18 03:19:24

0
  • 如果你只写只是同等条件: 选择案例columns1当0,则“值1” 时1然后“值”其他“未知”结束

  • 如果你想写选择大小写当[ColumnsName]> 0然后'value1'当[ColumnsName] = 0或[ColumnsName] < 0然后 'value2' 其他 'Unkownvalue'End

从表名

感谢 先生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

它应该工作。试试这个

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小马 - 我的一个不使用下面的代码

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

可以是该t.col1不在表中的实际列的原因。例如,它可以是来自XML列的值,如

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

使它变得如此简单。

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