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 语句中使用的别名列名的主要内容,如果未能解决你的问题,请参考以下文章