SQL CASE语句更改THEN子句中的列名

时间:2016-11-14 04:33:09

标签: sql-server

无论如何,我可以通过CASE STATEMENT中的THEN子句更改列名。这是我的代码看起来如何,但它无法正常工作。

 SELECT 
     CASE 
        WHEN @IDWeeklySpecial = '107' 
           THEN 
              CASE 
                 WHEN ISNULL(v.blnLeftHandDrive, 0) = 1 
                    THEN [HANDEDNESS] = 'LHD' 
                    ELSE [HANDEDNESS] = 'RHD' 
           ELSE 
              CASE 
                 WHEN ISNULL(v.blnLeftHandDrive, 0) = 1
                    THEN STEERING = 'LHD' 
                    ELSE STEERING = 'RHD' 
             END 
     END

我想要这个结果

My Ideal Result

这可以实现吗?如果是这样的话?

4 个答案:

答案 0 :(得分:2)

不,这是不可能的...如果您要求动态修改结果集中的列名。

CASE表达式返回。要在结果集中指定列名,请指定别名。

  SELECT CASE ... END AS mycolname
       , ... 
    FROM ...

在解析和准备语句时确定列名。语句的执行无法修改列名。

(我可能不明白这个问题。目前还不清楚OP想要达到的目标。)

答案 1 :(得分:1)

case是一个表达式。您可以在表达式之前或之后命名列,但不能在中间命名。

此外,SQL语句需要返回一组固定的列,包括列名。

因此,您无法使用简单的SQL语句执行所需操作。您可以使用动态SQL:

declare @sql nvarchar(max);
set @sql = '
SELECT (CASE WHEN COALESCE(v.blnLeftHandDrive, 0) = 1
             THEN 'LHD'
             ELSE 'RHD'
         END) as [columnname]
. . . ';

set @sql = replace(@sql, '[columnname]',
                   (case when @IDWeeklySpecial = '107' then 'HANDEDNESS' else 'STEERING' end)
                  );

exec sp_executesql @sql;

请注意,. . .用于SQL查询的其余部分。

答案 2 :(得分:0)

我无法消化您的select语句,但假设其内联案例

SELECT item_name = CASE WHEN item_name = 'sometext' THEN item_id ELSE item_name END AS MyColumnName

答案 3 :(得分:0)

不可能在查询中分配不同的列名,因为结果集中的所有垂直数据值都属于同一列。

如果您只是在使用CASE表达式时尝试为列名加上别名,请确保在END关键字之后使用AS。其他人提到了这一点,但这是我的问题。将其更改为类似的格式,并且可以正常工作:

CASE  
    WHEN table1.Name LIKE '%John%' THEN 'Some John Person' 
    WHEN table1.Name <> 'NULL' THEN table1.Name
    ELSE 'Nobody' 
END AS NewAliasColumnName