我有一个像这样的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
。
答案 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