将SQL表行与单个文本中的条件连接起来

将SQL表行与单个文本中的条件连接起来,sql,sql-server,sql-server-2008,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,

我有一个像这样的
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
我期待像这样的输出

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
这种情况的条件是
如果col1>0
那么
SL
else'
如果col2>0
else'
如果col3>0pl
else'

我试着使用,但没能达到预期的效果

我已经试过了,它可以很好地处理消息

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

但是我的最后一个条件是不匹配的,如果所有列都是0,那么我必须根据所需的输出显示
NULL


查找attach fiddle

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

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 

使用
nullif
修复它:
子字符串(NewCol,1,len(nullif(NewCol,))-1)作为NewCol
您还可以更改为在前面附加分隔符并使用

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             |
+------+------+------+------------------+
要玩这个把戏,你必须先检查一下

双向

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


所以你的问题在哪里?@cybermonkey我改变了我的问题这里仍然没有问题。请添加更多详细信息,并添加问题。您链接到的问题有多个答案,请分享您在自己的sql语句中使用的答案之一,并包括错误(如果有)。@jpw许多列,如
ID、EmpId、Department
BTW、,NewCol是表中的新列吗?在这种情况下,存储这样的值是非常错误的。如果您要显示的是您的输出,那么就不需要这样的计算列,您可以借助类属性进行这样的操作,从而避免这样复杂的查询。这也起到了作用。但我从来没用过东西。谢谢分享:)@SabyasachiMishra-为什么是“但是”?使用新的东西是消极的吗?啊,也许你误解了我的话。我说我从来没有用过,因为我从来没有听说过。@SabyasachiMishra-所以你可能不想在那里用“但是”这个词。-它读起来好像“它有效”(肯定),然后“但是”通常会引入否定。@MartinSmith:超级喜欢你的答案!!