Concat具有NULL值

时间:2014-07-25 09:59:24

标签: sql sql-server sql-server-2008 tsql

我的查询看起来像这样:

select distinct col1,
(
    select ltrim(str(col2))+','
    from @temp t2
    where t2.col1 = t1.col1
    for xml path('')
) col2
from @temp t1

col2中的某些值为null,因此不是显示带有null的字符串,而是完全缺少该部分,即

col2应该有

3,4,3,NULL,2,3,4,3,2,

但我得到了:

3,4,3,2,3,4,3,2,

我该如何纠正?

4 个答案:

答案 0 :(得分:2)

要获得NULL输出,您需要将NULL值更改为字符串' NULL'。这也意味着您需要将数值转换为字符串以使字段具有一致的类型;

SELECT DISTINCT col1,
(
    SELECT COALESCE(CAST(col2 AS VARCHAR),'NULL')+','
    FROM @temp t2
    WHERE t2.col1 = t1.col1
    FOR XML PATH('')
) col2
FROM @temp t1

An SQLfiddle to test with

答案 1 :(得分:1)

NULL值不是字符串NULL。这完全是缺乏信息。您可以做的是强制将NULL值视为字符串NULL,如下所示:

SELECT CASE
      WHEN col2 IS NULL THEN 'NULL'
      ELSE col2
      END + ','

为简化起见,您可以使用isnull(col2,'NULL')coalesce(col2,'NULL')

如果col2不是文字类型,请在使用上述任何解决方案之前先将其投射:

SELECT CASE
      WHEN col2 IS NULL THEN 'NULL'
      ELSE CAST(col2 AS VARCHAR(5))
      END + ','

答案 2 :(得分:0)

试试这个:

SELECT  DISTINCT col1,
        (
           SELECT ISNULL(CAST(col2 AS VARCHAR(10)),'NULL') + ','
           FROM   @Temp AS T2
           WHERE  T2.col1 = T1.col1
           FOR    XML PATH('')
        ) AS col2
FROM    @Temp AS T1

将任何值添加到NULL将导致 NULL

  

任何值+ NULL = NULL

答案 3 :(得分:0)

这应该有效。希望它有用

DECLARE @temp TABLE (col1 INT,col2 INT)

INSERT INTO @temp (col1,col2)
VALUES (1, 2),
      (1, 3),
      (1, 4),
      (1, NULL),
      (1, 6),
      (1, 7)

SELECT DISTINCT col1,
             SUBSTRING((
             SELECT ','+LTRIM(ISNULL(STR(col2),'NULL'))
             FROM @temp AS t2
             WHERE t2.col1 = t1.col1
             FOR XML PATH('')
             ),2,200000) AS col2
FROM @temp AS t1