将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:超级喜欢你的答案!!