我的查询看起来像这样:
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,
我该如何纠正?
答案 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
答案 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