在sql server中使用xml路径合并字段,显示逗号,其中NULL

问题描述:

我有一个表中列出了单个id的两个或更多不同日期。我想合并一个ID的所有日期。示例代码如下。在sql server中使用xml路径合并字段,显示逗号,其中NULL

create table number(id nvarchar(255), billdate nvarchar(255)) 
insert into number(id,billdate) values ('56465','12/10/2011'),('56465','02/11/2011'), 
('46462','12/09/2009'),('46462','12/06/2010'),('32169','12/22/2009'), 
('32169','12/31/2011'),('86835','12/10/2010'),('86835','22-Jan-2010'), 
('65641',''),('65641','12-Aug-2009'),('22458','25-Aug-2007'),('22458','') 

对于合并我使用XML路径的行如下

select Main.id,LEFT(Main.billdate,nullif(LEN(Main.billdate)-1,-1)) as "billdate" 
from (select distinct ST2.id,(SELECT ST1.billdate + ',' AS [text()] 
from NUMBER ST1 where ST1.id=ST2.id ORDER BY ST1.id FOR XML PATH (''))billdate 
from NUMBER ST2)[Main] 

它可以正常使用这个样本数据,但问题是我有大量的数据,而当我将此XML路径如果日期为NULL,则代码逗号不会显示,如ID 65641.对于我来说,在NULL位置显示逗号很重要。我哪里错了?任何人都可以建议为什么它不显示空位的逗号?

我不确定我是否完全理解你,因为65641的推定NULL值实际上是空白。为了治疗NULL值一样空白,您可以使用此:

select Main.id,LEFT(Main.billdate,nullif(LEN(Main.billdate)-1,-1)) as "billdate" 
from 
(
    select distinct ST2.id, 
    (
     SELECT ISNULL(ST1.billdate + ',', ',') AS [text()] 
     from NUMBER ST1 
     where ST1.id=ST2.id 
     ORDER BY ST1.id 
     FOR XML PATH ('') 
    ) billdate 
    from NUMBER ST2 
)[Main] 

你可能会遇到的另一个问题是,如果只有一个空/空对于一个给定id值,你不会连它的单个逗号。发生这种情况的原因是一个空白值仅生成一个逗号,然后由您的LEFT语句剥离。你可以把它通过改变它像这样独自离开单逗号:

select Main.id,LEFT(Main.billdate,nullif(LEN(Main.billdate)-CASE WHEN LEN(Main.billdate) = 1 THEN 0 ELSE 1 END,-1)) as "billdate" 
from 
(
    select distinct ST2.id, 
    (
     SELECT ISNULL(ST1.billdate + ',', ',') AS [text()] 
     from NUMBER ST1 
     where ST1.id=ST2.id 
     ORDER BY ST1.id 
     FOR XML PATH ('') 
    ) billdate 
    from NUMBER ST2 
)[Main] 

你还有问题,其中之一是,你有日期没有明确的排序,但我希望,涵盖了你的问题。如果没有,澄清,我会试图帮助更多。