Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 具有空值的Concat_Sql_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

Sql 具有空值的Concat

Sql 具有空值的Concat,sql,sql-server,sql-server-2008,tsql,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

我有一个类似这样的查询:

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,
如何更正此问题?

尝试以下方法:

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


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

SELECT CASE
      WHEN col2 IS NULL THEN 'NULL'
      ELSE col2
      END + ','
SELECT CASE
      WHEN col2 IS NULL THEN 'NULL'
      ELSE CAST(col2 AS VARCHAR(5))
      END + ','
为了使它更简洁,您可以使用
isnull(col2,'NULL')
coalesce(col2,'NULL')

如果
col2
不是文本类型,请先强制转换它,然后再使用上述任何解决方案,如:

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

要获得空输出,需要将空值更改为字符串“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

.

这应该行得通。希望能有所帮助

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

你能发布一个可执行的复制吗?出于测试目的,将子查询替换为常量NULL。@不幸的是,usr对我来说是新的可执行程序。不知道这是什么意思。发布一个任何人都可以执行的查询以查看错误的结果。@oshirowanen:为了方便起见,我发布了一个复制语句示例。