如何基于SELECT中的其他列构造新列

时间:2016-10-20 14:30:43

标签: sql sql-server sql-server-2016

我有这张桌子:

Assets
--------------------------------
Description VARCHAR(50) NOT NULL
Suffix1 VARCHAR(50) NOT NULL
UseSuffix1 BIT NOT NULL
Suffix2 VARCHAR(50) NULL
UseSuffix2 BIT NOT NULL
Suffix3 VARCHAR(50) NULL
UseSuffix3 BIT NOT NULL

我正在尝试执行构造以下内容的SELECT语句:包含Description字段的VARCHAR(MAX)列,以及在需要时附加的其他后缀(通过UseSuffixX标志)

输入和输出的例子:

'MyDesc'
'Suffix1'
0
NULL                 ->     'MyDesc'
0
NULL
0
-----------------------
'MyDesc'
'Suffix1'
1
NULL                 ->     'MyDesc - Suffix1'
0
NULL
0
-----------------------
'MyDesc'
'Suffix1'
0
'Suffix2'            ->     'MyDesc - Suffix2 - Suffix 3'
1
'Suffix3'
1
-----------------------
'MyDesc'
'Suffix1'
1
'Suffix2'            ->     'MyDesc - Suffix1 - Suffix 3'
0
'Suffix3'
1

我开始在我的CASE中使用SELECT指令,如下所示:

SELECT
    [Description] + 
    CASE 
        WHEN UseSuffix1 = 1 THEN ' - ' + Suffix1
        WHEN UseSuffix2 = 1 THEN ' - ' + Suffix2
        WHEN UseSuffix3 = 1 THEN ' - ' + Suffix3
        ELSE ''
    END
FROM Assets

但很快意识到我需要在每个WHEN分支中扩展所有可能性的树...不确定我是否在这里正确表达自己。

更实际的方法是什么?

1 个答案:

答案 0 :(得分:2)

您不需要所有可能性,每个后缀只有一个case

SELECT ([Description] + 
        (CASE WHEN UseSuffix1 = 1 THEN ' - ' + Suffix1 ELSE '' END) +
        (CASE WHEN UseSuffix2 = 1 THEN ' - ' + Suffix2 ELSE '' END) +
        (CASE WHEN UseSuffix3 = 1 THEN ' - ' + Suffix3 ELSE '' END) 
       )
FROM Assets