SQL:用于CASE语句的别名列名

Ver*_*gen 44 sql

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

SELECT col1 as a, CASE WHEN a = 'test' THEN 'yes' END as value FROM table;
Run Code Online (Sandbox Code Playgroud)

我试图别名列,因为实际上我的CASE语句将以编程方式生成,我希望在SQL中指定case语句使用的列,而不是必须将另一个参数传递给程序.

OMG*_*ies 59

这个:

SELECT col1 as a,
       CASE WHEN a = 'test' THEN 'yes' END as value 
  FROM table;
Run Code Online (Sandbox Code Playgroud)

...... 不行.这:

SELECT CASE WHEN a = 'test' THEN 'yes' END as value
  FROM (SELECT col1 AS a
          FROM TABLE)
Run Code Online (Sandbox Code Playgroud)

为什么你不会使用:

SELECT t.col1 as a,
       CASE WHEN t.col1 = 'test' THEN 'yes' END as value 
  FROM TABLE t;
Run Code Online (Sandbox Code Playgroud)

...我不知道.

  • 也许“a”是一个缓慢的函数,不值得运行两次。 (2认同)

eKe*_*ek0 45

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

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

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


小智 5

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

SELECT t.col1 as a, 
     CASE WHEN t.col1 = 'test' THEN 'yes' END as value 
FROM TABLE t;
Run Code Online (Sandbox Code Playgroud)

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

Select XMLColumnName.value('(XMLPathOfTag)[1]', 'varchar(max)') 
as XMLTagAlias from Table
Run Code Online (Sandbox Code Playgroud)