如题,
例如有表a如下:
id name age
-- ---- ---
1 zhangsan 23
2 lisi 40
3 wangwu 30要求利用sql语句将id列的值连接成字符创并放在变量里,变量如下:
declare @res varchar(30);
结果类似:'1,2,3'在网上找了一些都没有达到效果,特来请教
例如有表a如下:
id name age
-- ---- ---
1 zhangsan 23
2 lisi 40
3 wangwu 30要求利用sql语句将id列的值连接成字符创并放在变量里,变量如下:
declare @res varchar(30);
结果类似:'1,2,3'在网上找了一些都没有达到效果,特来请教
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([id] int,[name] varchar(8),[age] int)
insert [tb]
select 1,'zhangsan',23 union all
select 2,'lisi',40 union all
select 3,'wangwu',30
---查询---
declare @res varchar(30);
select @res=isnull(@res+',','')+ltrim(id) from tb
select @res---结果---------------------------------
1,2,3(1 行受影响)
select @res=@res+','+ltrim(id) from prm_tb
这样的话没有效果,变量里是NULL
帮助里关于isnull()的解释是:
“如果 check_expression 不为 NULL,则返回它的值;否则,在将 replacement_value 隐式转换为 check_expression 的类型(如果这两个类型不同)后,则返回前者。”
那么isnull(@res+',','')中的@res+','表达式岂不是永远都不会为NULL?
事实上,也可以这样declare @res varchar(30);
set @res=''
select @res=','+ltrim(id) from tb
select stuff(@res,1,1,'') --去掉前面的,号
这里的空值,指的是空字符串'',而非null
因为你这个变量没有给它赋初值,所以他是NULL,他加任何值都是NULL。
所以你要用isnull()替换到@res 为NULL的情况