SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串


Posted in SQL Server onMay 25, 2022

概述

  • STRING_AGG(合并):多行数据合并成一个字符串,以逗号隔开。
  • STRING_SPLIT(拆分):一个字符串,拆分成多行。

SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串

一、多行数据合并成一个字符串

1、通过 FOR xml path('') 合并字符串记录

根据name字段,合并code

declare  @table1  table (    id int ,code varchar(10) , name varchar(20) );
 
insert into @table1 ( id,code, name ) values ( 1, 'm1','a' ), ( 2,  'm2',null ), ( 3, 'm3', 'c' ), ( 4,  'm2','d' ), ( 5,  'm1','c' );

select * from @table1;

select name, files=stuff((select ','+convert(varchar, code)
                          from @table1 b
                          where a.name=b.name
                         for xml path('')), 1, 1, '')
from @table1 a
group by name;

结果:

SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串

2、MS SQL Server的2017新增了STRING_AGG()是一个聚合函数

它将由指定的分隔符分隔将字符串行连接成一个字符串。 它不会在结果字符串的末尾添加分隔符。

SELECT  name,   string_agg(code,';') files FROM @table1 GROUP BY name;

二、一个字符串拆分成多行

1、拆一列数据:

将如下从Excel复制的一栏数据,插入到表中行进显示(同时去掉回车换行符,空白和Tab符号):

1、利用XML解析方式(推荐)

declare @moulds varchar(4000);
set @moulds='55-480730-03,
55-487780-01,
,
 55-487780-02 ';
declare @table1 table(col1 nvarchar(4000));
declare @table2 table(col1 nvarchar(40),xmlval1 xml);
insert into @table1 values(replace(@moulds, char(13)+char(10), ''));
select * from @table1

insert into @table2  
select   rtrim(ltrim(replace(bs.v1, char(9), '') )),a.xmlval1
from (select convert(xml, '<n>'+replace(replace(col1, ',', ','), ',', '</n><n>')+'</n>') as xmlval1  
       from @table1) a
       cross apply(select k.n.value('.', 'nvarchar(80)') v1 from a.xmlval1.nodes('n') k(n) ) bs
where bs.v1 !='';

select * from @table2;

结果:

SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串

2、利用字符串拆解

declare @moulds varchar(4000);
set @moulds='55-480730-03,
55-487780-01,
,
 55-487780-02 ';
declare @table1 table(col1 nvarchar(4000));
declare @table2 table(col1 nvarchar(40), pos int);
insert into @table1 values(replace(@moulds, char(13)+char(10), ''));
select * from @table1;

insert into @table2
select rtrim(ltrim(replace(substring(A.col1, B.number, charindex(',', A.col1+',', B.number)-B.number) , char(9), '') )) as col2, B.number
from @table1 A
     inner join master..spt_values B
         on charindex(',', ','+A.col1, B.number)=B.number
where B.type='P';

select * from @table2;

结果:

SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串

2、拆多列数据:

有如下数据表

SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串

需求就是将Col1,Col2按照特定的字符串分割成多行

SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串

先将该字段值统一替换为逗号分割,再将逗号分割替换转为XML数据类型,再利用xml转为多个行

declare @table1 table
    (
        ID int ,
        Col1 nvarchar(50) ,
        Col2 nvarchar(50)
    );

insert into @table1 values ( 1, 'a,b,c', '诶,必,塞,地,伊' );
insert into @table1 values ( 2, 'w', N'三四,不知道咧' );


--方式一
select a.ID, a.Col1, a.Col2,  v1, v2
from   (   select ID, Col1, Col2, convert(xml, '<n>' + replace(replace(Col1, ',', ','), ',', '</n><n>') + '</n>') as xmlval1 ,
                                  convert(xml, '<n>' + replace(replace(Col2, ',', ','), ',', '</n><n>') + '</n>') as xmlval2
           from   @table1 ) a
       cross apply (   select k.n.value('.', 'nvarchar(80)') v1
                       from   a.xmlval1.nodes('n') k(n) ) bs
       cross apply (   select k.n.value('.', 'nvarchar(80)') v2
                       from   a.xmlval2.nodes('n') k(n) ) ns;

--方式二
select ID, t.Col1,t.Col2,  v1, v2
from   @table1 as t
       cross apply ( values (convert(xml, '<n>' + replace(replace(Col1, ',', ','), ',', '</n><n>')+ '</n>'), 
                             convert(xml, '<n>' + replace(replace(Col2, ',', ','), ',', '</n><n>')+ '</n>'))
                   ) a (xmlval1 , xmlval2 )
       cross apply (   select k.n.value('.', 'varchar(80)') as v1
                       from   a.xmlval1.nodes('n') k(n)) bs
       cross apply (   select k.n.value('.', 'varchar(80)') as v2
                       from   a.xmlval2.nodes('n') k(n) ) ns;

3、创建自定义拆分函数

函数功能:切分字符串, 返回一个列名为id的表

--1. 创建fn_Split函数
IF EXISTS(
       SELECT *
       FROM   dbo.sysobjects
       WHERE  id = OBJECT_ID('fn_Split')
              AND (TYPE = 'FN' OR TYPE = 'TF' OR TYPE = 'IF')
   )
    DROP FUNCTION fn_Split  
GO  
   
CREATE FUNCTION [dbo].[fn_Split]
(
    @str           VARCHAR(MAX),
    @separator     VARCHAR(10)
)
RETURNS TABLE
AS
    RETURN 
    (
        
        SELECT B.id
        FROM   (
                   (
                          --A 的作用只是生成 '<v>a</v><v>b</v><v>d</v><v>c</v>' 的XML格式的数据, 提供数据源 
                       SELECT [value] = CONVERT(XML, '<v>' + REPLACE(@str, @separator, '</v><v>') + '</v>')
                   ) A 
                   OUTER APPLY
                   (
                          --B 的作用是将A中的 XML 数据的值枚举出来转换成行
                       SELECT id = N.v.value('.', 'varchar(100)') FROM   A.[value].nodes('/v') N(v)
                   ) B
               )
    )
GO

使用函数 SELECT id FROM fn_Split('a,b,d,c',',')

declare @moulds varchar(4000);
set @moulds='55-480730-03,
55-487780-01,
,
 55-487780-02 ';
declare @table1 table(id INT,col1 nvarchar(MAX));

INSERT INTO @table1 VALUES(1,replace(@moulds, char(13)+char(10), ''))
INSERT INTO @table1 VALUES(2,replace(@moulds, char(13)+char(10), ''))
select * from @table1;

SELECT a.id,rtrim(ltrim(replace(b.id, char(10), '') )) AS item 
FROM @table1 a CROSS APPLY dbo.fn_Split(a.col1,',') AS b
where b.id !=''

4、SQL Server 2016新增了string_split函数

专门用来拆分字符串。

SELECT t.id,
       t.name,
       t.description,
       v.value
FROM test t
    CROSS APPLY STRING_SPLIT(t.description, ',')v;

到此这篇关于SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串的文章就介绍到这了。


Tags in this post...

SQL Server 相关文章推荐
mybatis调用sqlserver存储过程返回结果集的方法
May 08 SQL Server
sql查询结果列拼接成逗号分隔的字符串方法
May 25 SQL Server
SQL Server代理:理解SQL代理错误日志处理方法
Jun 30 SQL Server
SQL SERVER触发器详解
Feb 24 SQL Server
Sql Server之数据类型详解
Feb 28 SQL Server
如何使用SQL Server语句创建表
Apr 12 SQL Server
SQL Server Agent 服务无法启动
Apr 20 SQL Server
Sql Server 行数据的某列值想作为字段列显示的方法
Apr 20 SQL Server
SQL Server #{}可以防止SQL注入
May 11 SQL Server
SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串
May 25 SQL Server
SQL Server中T-SQL标识符介绍与无排序生成序号的方法
May 25 SQL Server
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
May 25 #SQL Server
SQL Server使用PIVOT与unPIVOT实现行列转换
May 25 #SQL Server
SQL SERVER中的流程控制语句
May 25 #SQL Server
SQL Server中搜索特定的对象
May 25 #SQL Server
SQL Server使用T-SQL语句批处理
May 20 #SQL Server
SQL Server 中的事务介绍
May 20 #SQL Server
SQL Server中锁的用法
May 20 #SQL Server
You might like
vBulletin HACK----关于排版的两个HACK
2006/10/09 PHP
dedecms采集中可以过滤多行代码的正则表达式
2007/03/17 PHP
php文件压缩之PHPZip类用法实例
2015/06/18 PHP
php 数组随机取值的简单实例
2016/05/23 PHP
Zend Framework数据库操作方法实例总结
2016/12/11 PHP
Using the TextRange Object
2006/10/14 Javascript
javascript 常用功能总结
2012/03/18 Javascript
js自动生成对象的属性示例代码
2013/10/28 Javascript
深入分析js的冒泡事件
2014/12/05 Javascript
jQuery中noconflict函数的实现原理分解
2015/02/03 Javascript
JavaScript实现鼠标滑过图片变换效果的方法
2015/04/16 Javascript
JavaScript中reduce()方法的使用详解
2015/06/09 Javascript
jquery使整个div区域可以点击的方法
2015/06/24 Javascript
javascript实现动态表头及表列的展现方法
2015/07/14 Javascript
解决jquery无法找到其他父级子集问题的方法
2016/05/10 Javascript
jQuery模拟下拉框选择对应菜单的内容
2017/03/07 Javascript
AngularJs导出数据到Excel的示例代码
2017/08/11 Javascript
jquery实现动态创建form并提交的方法示例
2019/05/27 jQuery
jQuery实现提交表单时不提交隐藏div中input的方法
2019/10/08 jQuery
python中的协程深入理解
2019/06/10 Python
python中while和for的区别总结
2019/06/28 Python
Python + OpenCV 实现LBP特征提取的示例代码
2019/07/11 Python
Python学习笔记之文件的读写操作实例分析
2019/08/07 Python
基于tensorflow __init__、build 和call的使用小结
2021/02/26 Python
详解Html5微信支付爬坑之路
2018/07/24 HTML / CSS
html5 worker 实例(二) 图片变换效果
2013/06/24 HTML / CSS
鞋类设计与工艺专业销售求职信
2013/11/01 职场文书
小学生家长评语集锦
2014/01/30 职场文书
消防安全宣传标语
2014/06/07 职场文书
干部竞争上岗演讲稿
2014/09/11 职场文书
试用期辞职信范文
2015/03/02 职场文书
教师师德承诺书2016
2016/03/25 职场文书
创业计划书之奶茶店开店方案范本!
2019/08/06 职场文书
用Python爬取各大高校并可视化帮弟弟选大学,弟弟直呼牛X
2021/06/11 Python
JS 基本概念详细介绍
2021/10/16 Javascript
JAVA SpringMVC实现自定义拦截器
2022/03/16 Python