使用单个文本中的条件连接SQL表行

时间:2015-09-19 10:03:15

标签: sql sql-server sql-server-2008

我有一个像这样的SQL

col1     col2      col3
1         0         1
1         1         1
0         1         1
1         0         0
0         0         0

我期待输出像这样

col1     col2      col3     NewCol
1         0         1        SL,PL
1         1         1        SL,EL,PL
0         1         1        EL,PL
1         0         0        SL
0         0         0        NULL

此条件为if col1>0然后SL else ' 'if col2>0 EL else ' 'if col3>0 PL {{1} }

我尝试使用Concatenate many rows into a single text string?,但未能正确达到预期效果

我试过它可以正常使用消息

  

传递给LEFT或SUBSTRING函数的长度参数无效。

else ' '

但是,如果所有列都为0,那么我的最后一个条件不匹配,那么我必须根据所需的输出显示WITH CTE AS ( SELECT col1, col2, col3, CASE WHEN col1 > 0 THEN 'SL,' ELSE '' END + CASE WHEN col2 > 0 THEN 'EL,' ELSE '' END + CASE WHEN col3 > 0 THEN 'PL,' ELSE '' END AS NewCol FROM Employee ) SELECT col1, col2, col3, substring(NewCol, 1, len(NewCol) - 1) AS NewCol FROM CTE

找到附加小提琴http://sqlfiddle.com/#!6/2bd6a/1

3 个答案:

答案 0 :(得分:3)

您的代码示例的问题是,当所有列都为0时,长度为0,子字符串函数将引发错误。

使用nullif进行修复:substring(NewCol, 1, len(nullif(NewCol,'')) - 1) AS NewCol

答案 1 :(得分:2)

您也可以更改为在前面附加分隔符并使用STUFF

STUFF('',1,1,'')将返回NULL而不是错误。

WITH 
Employee(col1, col2, col3) AS (
SELECT 1,1,1 UNION ALL
SELECT 0,0,0
),
CTE AS (
   SELECT col1, col2, col3,
          CASE WHEN col1 > 0 THEN ',SL' ELSE '' END +
          CASE WHEN col2 > 0 THEN ',EL' ELSE '' END +
          CASE WHEN col3 > 0 THEN ',PL' ELSE '' END AS NewCol
   FROM   Employee
)
SELECT col1,
       col2,
       col3,
       STUFF(NewCol, 1, 1, '')
FROM   CTE 

返回

+------+------+------+------------------+
| col1 | col2 | col3 | (No column name) |
+------+------+------+------------------+
|    1 |    1 |    1 | SL,EL,PL         |
|    0 |    0 |    0 | NULL             |
+------+------+------+------------------+

答案 2 :(得分:1)

您必须与NULLIF核实才能执行此操作

两种方式

SELECT col1, col2, col3,
    nullif(CASE WHEN col1  = 1 THEN 'SL,' ELSE '' END +
           CASE WHEN col2  = 1 THEN 'EL,' ELSE '' END +
           CASE WHEN col3  = 1 THEN 'PL,' ELSE '' END,'') AS NewCol 
FROM Employee

OR

SELECT 
    col1,
    col2,
    col3,
    substring(nullif(NewCol,''), 1, len(NewCol) - 1) AS NewCol
FROM  
    CTE