【发布时间】:2018-10-12 08:44:45
【问题描述】:
请考虑以下陈述:
select stuff((
select '; ' + ([FIELD_1] + [FIELD_2] + [...] + [FIELD_N])
from [TABLE] t1
where t1.[ID] = t2.[ID]
for xml path ('')
),1,1, '')
from [TABLE] t2
如果语句连接了 10 条具有相同 ID 的记录,但所有记录都没有值('',或为空,而不是 null),则输出为:
; ; ; ; ; ; ; ; ; ;
如果填写了 2 条记录,我会得到
; ; ; AAA; ; ; ; BBB;
在这两种情况下我想要的是null,分别是AAA; BBB
我试过这样修复它:
select stuff((
select case when [FIELD_1] <> '' then '; ' + ([FIELD_1]) else '' end
from [TABLE] t1
where t1.[ID] = t2.[ID]
for xml path ('')
),1,1, '')
from [TABLE] t2
这很有效,当我只选择FIELD_1 时,这对我来说已经足够优雅了。但是当我选择许多连接字段 (FIELD_1 + ... + FIELD_N) 时,这会变得非常难看。
我做错了什么? stuff() 不应该把我的问题作为一个函数来处理吗?
【问题讨论】:
-
';' + ''会给你';'。这是对的。如果要跳过空字符串,请将该条件添加到WHERE子句
标签: sql-server tsql sql-server-2012