SQL Server 字符串合并
应用场景:多条数据某列数据以某种样式合并成一条数据,例如:
1 1,0 小赵 001
2 2,0 小钱 002 =====》 小赵(001),小钱(002),小李(004)
4 4,0 小李 004
1、首先建立简化模型:假设老王有四个邻居,赵钱孙李,现在有四个小孩,小赵小钱小孙小李
2、建表:
(1)建立小区住户表
CREATE TABLE xiaoqv(
id INT NOT NULL,
name NVARCHAR(50) NOT NULL
)
小区里有五位住户,插入小区住户表
INSERT INTO xiaoqv VALUES
(0,'隔壁老王'),
(1,'赵'),
(2,'钱'),
(3,'孙'),
(4,'李')
(2)建立班级学生表
CREATE TABLE class (
id INT NOT NULL,
parentid NVARCHAR(50) NOT NULL,
name NVARCHAR(50) NOT NULL,
phone NVARCHAR(50) NOT NULL
)
班里有4位学生,根据住户确认,插入班级学生表
INSERT INTO class VALUES
(1,'1,0','小赵','1001'),
(2,'2,0','小钱','1002'),
(3,'3','小孙','1003'),
(4,'4,0','小李','1004')
当前表中的数据为;
3.建立查询
SELECT x.name AS name,
(SELECT STUFF((SELECT ','+ e.info
FROM (
SELECT ISNULL(name,'')+'('+ISNULL(xuehao,'*')+')' AS info FROM class c WHERE CHARINDEX(CONVERT(VARCHAR(50),x.id),c.parentid)>0
)e FOR XML PATH(''))
,1,1,'')
)AS children
FROM xiaoqv x
到这里就结束了
3.知识回顾
(1)字符串位置检索 charindex
(2)将表字段转化为xml表数据 for xml path('')
自定义分割格式
(3)字符串裁剪 stuff
看得出来,stuff(a,x,n,b)其意义为将字符串a从第x位开始,将其后的n位替换为 b
当然这里用 substring也可以,只是需要获取未知字符串长度,需要获取两次,代码比较臃肿,效率还低
全部sql语句
1 CREATE TABLE xiaoqv( 2 id INT NOT NULL, 3 name NVARCHAR(50) NOT NULL 4 ) 5 6 INSERT INTO xiaoqv VALUES 7 (0,'隔壁老王'), 8 (1,'赵'), 9 (2,'钱'), 10 (3,'孙'), 11 (4,'李') 12 13 CREATE TABLE class ( 14 id INT NOT NULL, 15 parentid NVARCHAR(50) NOT NULL, 16 name NVARCHAR(50) NOT NULL, 17 xuehao NVARCHAR(50) NOT NULL 18 ) 19 INSERT INTO class VALUES 20 (1,'1,0','小赵','1001'), 21 (2,'2,0','小钱','1002'), 22 (3,'3','小孙','1003'), 23 (4,'4,0','小李','1004') 24 25 SELECT * FROM dbo.xiaoqv 26 SELECT * FROM dbo.class 27 28 SELECT x.name AS name, 29 (SELECT STUFF((SELECT ','+ e.info 30 FROM ( 31 SELECT ISNULL(name,'')+'('+ISNULL(xuehao,'*')+')' AS info FROM class c WHERE CHARINDEX(CONVERT(VARCHAR(50),x.id),c.parentid)>0 32 )e FOR XML PATH('')) 33 ,1,1,'') 34 )AS children 35 FROM xiaoqv x 36 37 38 39 40 SELECT CHARINDEX('3','123456789') 41 42 SELECT name FROM class FOR XML PATH('') 43 44 SELECT ','+name FROM class FOR XML PATH('') 45 46 SELECT STUFF('123456789',2,5,'') 47 48 SELECT SUBSTRING('123456789',2,LEN('123456789')-1)