SQL Server:如何使用XML Path结合行后删除最后一个逗号?

10
我找到了一种方法,可以将多行合并为一行,用逗号分隔,但现在我想去掉最后一个逗号。
CREATE TABLE supportContacts 
(
   id int identity primary key, 
   type varchar(20), 
   details varchar(30)
);

INSERT INTO supportContacts (type, details)
VALUES ('Email', 'admin@sqlfiddle.com'),
       ('Twitter', '@sqlfiddle');

这个查询组合了不同的类型,但我现在想删除最后一个逗号:
SELECT top (2) 
    type + ', ' AS 'data()'
FROM  
    supportContacts
ORDER BY 
    type DESC
FOR XML PATH('')

这是当前的结果:

Twitter, Email,

在紧急情况下,您可以使用子字符串来删除最后一个字符 ;) - okaram
@okaram 如果我不知道字符串的长度,这个方法还能用吗?你能给我一个例子吗? - MattJ
3个回答

21

虽然你已经有了一个答案,但你可能会看到另一个常见的习语:

select stuff((
    SELECT top (2) 
        ', ' type AS 'data()'
    FROM  
        supportContacts
    ORDER BY 
        type DESC
    FOR XML PATH('')
), 1, 2, '')

这意味着“取选择结果,并用长度为零的字符串替换从第一个位置开始的两个字符”。


1
我强烈倾向于使用STUFF而不是尝试组合LTRIM/RTRIM/LEN等函数。 - Jason W

7

这对我有用 ->

1.在数据前插入逗号

2.使用 Stuff 函数将其删除

select (stuff((
   SELECT ', '+ Name  AS 'data()' 
   FROM Table_1 
   FOR XML PATH('')),
   Count('ID')
, 1, ' '))as Result

3
declare  @BigStrRes8K nvarchar(4000) 

SELECT @BigStrRes8K = ( SELECT top (2) [type] + ', ' AS 'data()'
FROM supportContacts 
ORDER BY type DESC
FOR XML PATH('') ) 

SELECT LEFT(RTRIM(@BigStrRes8K), ( LEN(RTRIM(@BigStrRes8K))) - 1) as FinalNoComma

如果我控制渲染代码,我绝不会这样做。我会教调用者处理尾随逗号。此外,您必须允许空值和SQL行的4K或8K限制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接