【问题标题】:SQL: Alias Column Name for Use in CASE StatementSQL:在 CASE 语句中使用的别名列名
【发布时间】: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 语句使用的列,而不必将另一个参数传递给程序。

【问题讨论】:

    标签: sql


    【解决方案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 
                  

                  【讨论】:

                  • 这里没有别名
                  猜你喜欢
                  • 1970-01-01
                  • 2013-07-09
                  • 2012-12-18
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多