Create table test(Names varchar(100) primary key )
insert into test values('Hugeman')
insert into test values('Jack')
insert into test values('William')
insert into test values('Kevin')
insert into test values('Peter')
查询1:
declare @sql varchar(100)
select @sql = coalesce(@sql+'+','')+Names from test order by names-- where object_id =object_id('temp')
print @sql
这将导致 的 Hugeman +杰克+凯文+彼得+威廉
查询2
declare @sql varchar(100)
select @sql = coalesce(Names+'+','') from test order by names-- where object_id =object_id('temp')
print @sql
这将导致威廉+
根据coalesce的文档,将返回第一个not null值。所以它必须导致 Hugeman + 。但它返回整行。
为什么query2没有做同样的事情?
答案 0 :(得分:2)
这与COALESCE
没有严格关联。
尝试以下选择:
DECLARE @sql1 AS VARCHAR(1000)
SELECT @sql1 = ISNULL(@sql1, '') + Names FROM test ORDER BY Names
PRINT @sql1
DECLARE @sql2 AS VARCHAR(1000)
SELECT @sql2 = Names FROM test ORDER BY Names
PRINT @sql2
那发生了什么?选择 EACH 记录:
@sql
@sql
重置为提取的姓氏我不明白你想从SELECT中获得什么,但COALESCE
的一个更好的例子可能是:
CREATE TABLE TEST2(Name VARCHAR(100) PRIMARY KEY, Telephone VARCHAR(10), Mobile VARCHAR(10))
INSERT INTO TEST2 VALUES('Hugeman', 1, 2)
INSERT INTO TEST2 VALUES('Jack', NULL, 3)
INSERT INTO TEST2 VALUES('William', 4, NULL)
INSERT INTO TEST2 VALUES('Kevin', 5, 6)
INSERT INTO TEST2 VALUES('Peter', NULL, NULL)
SELECT Name,
COALESCE(Telephone, Mobile) AS Tel
FROM TEST2
答案 1 :(得分:0)
@sql位于第一个附加的右侧
最后一个@sql在左侧是单独的,并且具有最后一行的值
答案 2 :(得分:0)
Query-1:将所有行的值附加到@sql Query-2:将值重新设置为@sql
以下是按名称排序的行
Hugeman 插口 凯文 彼得 威廉
Query-1将所有值附加到@sql。 Query-2将值重写为@sql,因此列表中的最后一行是William,因此当您打印变量时,将打印最后重新分配的值。
答案 3 :(得分:0)
COALESCE()函数返回来自列的第一个非空值作为COALESCE()函数中的参数。
<强> e.g。强>
SELECTCOALESCE(null,null,1,2) ///return --1
SELECT Id, COALESCE(FirstName, MiddleName, LastName) AS Name
FROM tblEmployee //return 1st non null value from FirstName/MiddleName/LastName