有如下数据表

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

一、利用XML解析方式

先将该字段值统一替换为逗号分割,再将逗号分割替换转为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;

二、利用通用表达式CTE

;with CTE
as ( select *, row_number() over ( partition by id order by ( select 1 )) as SEQ from @table1 ) select A.ID, substring(Col1, B.number, charindex(',', Col1 + ',', B.number) - B.number) as single_age
from CTE A
inner join master..spt_values B on charindex(',', ',' + Col1, B.number) = B.number
where B.type = 'P'
order by id, SEQ, B.number;

三、创建自定义函数

--1. 创建fn_Split函数. ( 切分字符串, 返回一个列名为id的表 )
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
(
--Example: SELECT id FROM fn_Split('a,b,d,c',',')
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

使用函数

DECLARE @t TABLE (id INT,age NVARCHAR(MAX))
INSERT INTO @t VALUES(1,'23|24|25|26|29')
INSERT INTO @t VALUES(1,'33|aa|bb|cc|ss')
INSERT INTO @t VALUES(2,'35|BB|CC|YY|RR') SELECT a.id,b.id AS item
FROM @t a CROSS APPLY dbo.fn_Split(a.age,'|') AS b

四、多行数据合并成一行

--通过 FOR xml path('') 合并字符串记录
select MouldCode, FolderType,
files = stuff(( select ',' + convert(varchar, ID)
from [MouldFiles] b
where a.MouldCode = b.MouldCode and a.FolderType = b.FolderType
for xml path('')) ,1 ,1 ,'')
from [MouldFiles] a
group by MouldCode, FolderType;

SQL一字段内的字符串按照特定字符串转化为多行显示的更多相关文章

  1. C语言考题:输入一个字符串,将此字符串中特定的字符删去后, 显示新的字符串,要求用函数来完成删去字符的操作。

    #include <stdio.h> #include <string.h> /*此题只需要删除单个字符,比较简单.相信大家也能做出来的.我这个也是可以实现的.只是加了两个判断 ...

  2. 【SQL】MySQL内置函数中的字符串函数和日期时间函数

    字符串函数 --拼接字符串组成新的字符串 Select concat(‘A’,’B’); --返回字符串长度 Select length(“CAT”) --返回子字符串在字符串中首次出现的位置,没有返 ...

  3. SQL 将一个字段内用逗号分隔的内容分成多条记录

    转自:http://www.cnblogs.com/zfanlong1314/archive/2013/01/14/2859848.html --> 测试数据 if not object_id( ...

  4. [bash] 获取linux主机名,检视内中是否有特定字符串

    代码: #!/bin/bash hostname=$(hostname) #调用hostname命令获取主机名放入变量hostname中 #echo $hostname if [ `echo ${ho ...

  5. Python用re正则化模块在字符串查找特定字符串

    实验需要,在一个含有几亿个字符的txt文件中查找特定的字符串,首先用re模块进行查找 from time import clock import re start=clock() label_file ...

  6. oracle将字符串根据特定字符串拆分为多个子字符串

    将 字符串 '20180321-4768-4735261' 按‘-’  拆分: 语法: INSTR()函数 1.用处: 在一个字符串中查找指定的字符,返回被查找到的指定的字符的位置. 2.语法格式: ...

  7. C#,.net获取字符串中指定字符串的个数、所在位置与替换字符串

    方法一: public static int indexOf (字符串/字符,int从第几位开始,int共查几位) string tests = "1absjjkcbfka2rsbcfak2 ...

  8. SQLServer学习笔记<>sql的范围内查找,sql数据类型,字符串处理函数

    sql的范围内查找 (1)between.....and用法 通常情况下我们查找一个在某固定区域内的所有记录,可以采用>=,<=来写sql语句,例如:查找订单价格在1000到2000之间的 ...

  9. SQL:将字符串以特定字符分割并返回Table

    split 语法 ALTER FUNCTION [dbo].[F_SPLIT] ( @str VARCHAR(MAX) , ) ) /********************************* ...

随机推荐

  1. async/await 与 generator、co 的对比

    之前写过一个分批预加载资源的插件,其实质便是串行执行异步,使用的方法是generator + promise -- 前几天写了一个爬虫,抓取页面的n个页面的音频资源,其也是串行执行异步,但是在使用的a ...

  2. springboot+cloud 学习(一)高可用服务注册中心(Eureka)

    先说说Eureka Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的.SpringClo ...

  3. C编程基础

    1. Hello World! 依照惯例首先Hello World镇楼: 1 #include<stdio.h> 2 3 int main(void) { 4 printf("H ...

  4. Vue Router的懒加载路径

    单页应用产出的入口chunk大小随着业务的复杂度线性增加,导致后期加载速度越来越慢.后面就需要对不同路径下的模块进行拆分,打包到相应的chunk下,按需加载,找到chunk的大小.个数和页面加载速度的 ...

  5. [转]史上最佳 Mac+PhpStorm+XAMPP+Xdebug 集成开发和断点调试环境的配置

    本文转自:https://www.cnblogs.com/lishiyun19/p/4470086.html 在上一篇 PHP 系列的文章<PHP 集成开发环境比较>中,我根据自己的亲身体 ...

  6. vue项目webpack打包后图片路径错误

    首先项目是vue-cli搭建的,项目结构如下: 然后发现在css里写的图片引用地址在开发时正常显示,但在打包扔上服务器之后报错 报的是404,路径前面多了/static/css,不知道为啥. 在自己慢 ...

  7. TCP Socket Http关系

    理解Tomcat内部处理网络数据的机制同时需要了解相关的一些术语,这样我们在阅读源码的时候能更加清楚的理解Connector下使用到的Socket通信原理. TCP/IP: 数据在网络传输是基于TCP ...

  8. MyBatis开发Dao层的两种方式(Mapper动态代理方式)

    MyBatis开发原始Dao层请阅读我的上一篇博客:MyBatis开发Dao层的两种方式(原始Dao层开发) 接上一篇博客继续介绍MyBatis开发Dao层的第二种方式:Mapper动态代理方式 Ma ...

  9. servlet 中处理 json 请求,并访问 service 类,返回处理结果

    前言:jar 包中的 servlet 必须可以处理前端发出的 ajax 请求,接收参数,并返回结果. github地址:yuleGH github 这里有个约定,url 地址是 .json 结尾的,如 ...

  10. Hadoop集群动态服役新的数据节点&&退役数据节点

    备注:新添的机器为hadoop05,现有hadoop01.hadoop02.hadoop03.hadoop04 环境准备: 1.先克隆一台和集群中一样的机器 2.修改机器ip和主机名称 3.删除原来的 ...