應用場景:多條數據某列數據以某種樣式合並成一條數據,例如:
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)