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)

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM