SQL:在 CASE 语句中使用的别名列名

Posted

技术标签:

【中文标题】SQL:在 CASE 语句中使用的别名列名【英文标题】:SQL: Alias Column Name for Use in CASE Statement 【发布时间】:2009-10-18 00:37:31 【问题描述】:

是否可以给列名取别名,然后在 CASE 语句中使用它?例如,

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

我正在尝试为该列设置别名,因为实际上我的 CASE 语句将以编程方式生成,并且我希望在 SQL 中指定 case 语句使用的列,而不必将另一个参数传递给程序。

【问题讨论】:

【参考方案1】:

这个:

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;

...我不知道。

【讨论】:

也许 'a' 是一个缓慢的函数,不值得运行两次。 如何使用 WITH 子句? CASE 语句中的列来自 WITH 子句,那么 CASE 会去哪里?【参考方案2】:

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

我不知道你在说什么 DBMS,但我想你可以在任何 DBMS 中做这样的事情:

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

【讨论】:

如果别名在临时表上,为什么这不起作用?我尝试在 WHERE 子句条件中使用别名。 这实际上在 SQL Server 中也非常简单...END AS column_name +1【参考方案3】:

@OMG Ponies - 我不使用以下代码的原因之一

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 * 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

【讨论】:

【参考方案5】:

我使用 CTE 来帮助编写复杂的 SQL 查询,但并非所有 RDBMS 都支持它们。您可以将它们视为查询范围视图。这是 SQL server 上的 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

【讨论】:

Oracle 9i+、SQL Server 2005+ 和 DB2(不知道版本)支持 WITH 语法。在 Oracle 和 SQL Server 的情况下,WITH 语法只是内联视图的替代方案。【参考方案6】:

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 它可以工作

【讨论】:

【参考方案7】:

如果你只写相等条件: 选择案例列 1 时为 0,然后选择“值 1” when 1 then 'Value2' else 'Unknown' End

如果你想写更大,小于或等于你必须这样做: 选择 Case When [ColumnsName] >0 then 'value1' When [ColumnsName]=0 or [ColumnsName]

来自表名

谢谢 本塔钦先生

【讨论】:

【参考方案8】:
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

【讨论】:

【参考方案9】:

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

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

【讨论】:

【参考方案10】:

在 MySql 中,alice name 可能不起作用,因此将原始列名放在 CASE 语句中

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

有时上面的查询也可能返回错误,我不知道为什么(我在我的两台不同的开发机器上遇到了这个问题)。因此将 CASE 语句放入“(...)”中,如下所示:

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

【讨论】:

【参考方案11】:

是的,您只需要添加一个括号:

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

【讨论】:

这在 SQL Server 中不起作用。返回“无效的列名'a'”【参考方案12】:

让它变得如此简单。

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

【讨论】:

这里没有别名

以上是关于SQL:在 CASE 语句中使用的别名列名的主要内容,如果未能解决你的问题,请参考以下文章

sql 2005 case 语句 - 列名无效

SQL语句中,子句不能使用列别名问题

我可以在case语句中使用列名作为参数吗

VF中SQl语句中的select语句如何使用……

Sql 语句。获取指定表的列名

SQL的别名和SQL的执行顺序和SQL优化