无法理解为什么这有效(合并)
Cannot understand why this works (coalesce)
DECLARE @result varchar(max)
SELECT
@result = coalesce(@result + ',', '') + Mobile
FROM
VMembers
WHERE
CommitteesID = 45
我觉得如果是检查Mobile的null,应该是
DECLARE @result varchar(max)
SELECT
@result = @result + ISNULL(Mobile + ',', '')
FROM
VMembers
WHERE
CommitteesID = 45
但这总是会产生 @result = NULL
。我不明白为什么第一个有效而第二个无效。
第一个版本正在检查 @result
是否有 NULL
,这是正确的,因为它以 NULL
开头。您的版本总是 return NULL,因为 @result
开始时是 NULL
。
代码未检查 Mobile
是否有 NULL
。
您还可以通过以下方式初始化该值:
DECLARE @result varchar(max) = '';
SELECT @result = @result + ',' + Mobile
FROM VMembers
WHERE CommitteesID=45
但是,这会在字符串的开头放置一个不必要的逗号。
请注意:这不是我首选的进行字符串聚合的方法,但它似乎确实有效。
None 的查询曾经初始化过@result,这意味着在查询开始之前@result 的值为 NULL。
在第一个查询中,这是由位于 COALESCE
语句内的 @result 处理的,当 @result 为 NULL 时输出 '' 。这在第二个查询中不会发生,因此输出将始终为 NULL(请记住,在连接字符串时,NULL + 'whatever' 始终等于 NULL)。
DECLARE @result varchar(max)
SELECT
@result = coalesce(@result + ',', '') + Mobile
FROM
VMembers
WHERE
CommitteesID = 45
我觉得如果是检查Mobile的null,应该是
DECLARE @result varchar(max)
SELECT
@result = @result + ISNULL(Mobile + ',', '')
FROM
VMembers
WHERE
CommitteesID = 45
但这总是会产生 @result = NULL
。我不明白为什么第一个有效而第二个无效。
第一个版本正在检查 @result
是否有 NULL
,这是正确的,因为它以 NULL
开头。您的版本总是 return NULL,因为 @result
开始时是 NULL
。
代码未检查 Mobile
是否有 NULL
。
您还可以通过以下方式初始化该值:
DECLARE @result varchar(max) = '';
SELECT @result = @result + ',' + Mobile
FROM VMembers
WHERE CommitteesID=45
但是,这会在字符串的开头放置一个不必要的逗号。
请注意:这不是我首选的进行字符串聚合的方法,但它似乎确实有效。
None 的查询曾经初始化过@result,这意味着在查询开始之前@result 的值为 NULL。
在第一个查询中,这是由位于 COALESCE
语句内的 @result 处理的,当 @result 为 NULL 时输出 '' 。这在第二个查询中不会发生,因此输出将始终为 NULL(请记住,在连接字符串时,NULL + 'whatever' 始终等于 NULL)。