SQL一字段内的字符串按照特定字符串转化为多行显示
有如下数据表
需求就是将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一字段内的字符串按照特定字符串转化为多行显示的更多相关文章
- C语言考题:输入一个字符串,将此字符串中特定的字符删去后, 显示新的字符串,要求用函数来完成删去字符的操作。
#include <stdio.h> #include <string.h> /*此题只需要删除单个字符,比较简单.相信大家也能做出来的.我这个也是可以实现的.只是加了两个判断 ...
- 【SQL】MySQL内置函数中的字符串函数和日期时间函数
字符串函数 --拼接字符串组成新的字符串 Select concat(‘A’,’B’); --返回字符串长度 Select length(“CAT”) --返回子字符串在字符串中首次出现的位置,没有返 ...
- SQL 将一个字段内用逗号分隔的内容分成多条记录
转自:http://www.cnblogs.com/zfanlong1314/archive/2013/01/14/2859848.html --> 测试数据 if not object_id( ...
- [bash] 获取linux主机名,检视内中是否有特定字符串
代码: #!/bin/bash hostname=$(hostname) #调用hostname命令获取主机名放入变量hostname中 #echo $hostname if [ `echo ${ho ...
- Python用re正则化模块在字符串查找特定字符串
实验需要,在一个含有几亿个字符的txt文件中查找特定的字符串,首先用re模块进行查找 from time import clock import re start=clock() label_file ...
- oracle将字符串根据特定字符串拆分为多个子字符串
将 字符串 '20180321-4768-4735261' 按‘-’ 拆分: 语法: INSTR()函数 1.用处: 在一个字符串中查找指定的字符,返回被查找到的指定的字符的位置. 2.语法格式: ...
- C#,.net获取字符串中指定字符串的个数、所在位置与替换字符串
方法一: public static int indexOf (字符串/字符,int从第几位开始,int共查几位) string tests = "1absjjkcbfka2rsbcfak2 ...
- SQLServer学习笔记<>sql的范围内查找,sql数据类型,字符串处理函数
sql的范围内查找 (1)between.....and用法 通常情况下我们查找一个在某固定区域内的所有记录,可以采用>=,<=来写sql语句,例如:查找订单价格在1000到2000之间的 ...
- SQL:将字符串以特定字符分割并返回Table
split 语法 ALTER FUNCTION [dbo].[F_SPLIT] ( @str VARCHAR(MAX) , ) ) /********************************* ...
随机推荐
- 大数据技术之_08_Hive学习_05_Hive实战之谷粒影音(ETL+TopN)+常见错误及解决方案
第10章 Hive实战之谷粒影音10.1 需求描述10.2 项目10.2.1 数据结构10.2.2 ETL原始数据10.3 准备工作10.3.1 创建表10.3.2 导入ETL后的数据到原始表10.3 ...
- [Node.js] 3、搭建hexo博客
一.安装新版本的nodejs和npm 安装n模块: npm install -g n 升级node.js到最新稳定版 n stable 二.安装hexo note: 参考github,不要去其 ...
- MFC控件之Combo Box
下拉链表Combo-box Control 常用属性: Sort:对添加到列表框的字符串进行自动排序.(对指定位置的元素项无效) Type:有三个类型 Simple:没有下拉按钮,可以输入字符串,可以 ...
- C# serialPort的DataReceived事件无法触发 ,用的霍尼韦尔的扫码枪并且装了相应的USB转串口驱动。
昨天想试试霍尼韦尔的扫码枪,扫码枪有两种模式,键盘模式和串口模式, 1.键盘模式直接插上就行了,就像一个键盘一样不需要任何驱动,扫出来的数据直接落到PC的输入焦点上.就像一个键盘一样,只能输入字符. ...
- Median(vector+二分)
Median Time Limit: 5 Seconds Memory Limit: 65536 KB The median of m numbers is after sorting them in ...
- Java虚拟机 - 类加载机制
[深入Java虚拟机]之四:类加载机制 类加载过程 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载.验证.准备.解析.初始化.使用和卸载七个阶段.它们开始的顺序如下 ...
- 数据定义语句(DDL语句)
建立表 create table 表名( 字段名1 类型, 字段名2 类型, ........ 字段名n 类型): 类型有: char(n) 是一个类型,叫定长字符串,数据不够就补空格 v ...
- HDU3081(KB11-N 二分答案+最大流)
Marriage Match II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- 大数据java基础day01
day01笔记 1.==操作符和equals方法 equals方法存在于Object类中,所有类的equals方法都继承于Object 2.String类的常用方法 ①.replace()替换字符串 ...
- PHP文件上传,下载,Sql工具类!
PHP文件上传,下载,Sql工具类! 对文件大小,文件类型 同名覆盖 中文转码的操作,可直接使用 前台 upload.html <!DOCTYPE html> <html> & ...