DB String Split sample
以sqlserver为例进行说明,代码稍加修改,可以用于ORACLE。
字符串的拆分和聚合是数据库开发人员比较常见的任务。
关于字符串的聚合和拆分,sqlserver的标准解决方案是for xml path.
oracle 11g提供了listagg函数方便获取。
今天就字符串的拆分进行分析。重点在于思路。
示例数据.
1,’a,b,c,d,e,f,g’
需要把数据拆分成标准的行。
1,a
1,b
第一步:
一行变多行, 需要增加副本,如何增加条数? 而且条数刚好和分隔符的个数+1个相同。
可以使用数据辅助表 join 原表,需要注意的是如何写on的条件,来达到要求。
第二步:只要办成了第一步,第二步就简单明了了,截取字符串,如何截取合适的长度?
有了思路,就可以写出代码,细节处再慢慢调整即可。以下写入我的代码。
第二种思路是使用递归CTE。
第一步写基准查询,查出每一个待拆分的字符串中第一个分隔符出现的位置,作为截取字符串的结束位置,而
显然1是开始位置。
第二步递归步骤,根据第一步,[end]+1 as start, 再把第一个的[end+1]作为查询的起点,查找下一个分隔符出现的位置作为结束位置。
结束条件就是从N开始查找待分隔的字符串没有分隔符了。
方法二写起来简单明了,但是如果待分隔的字符串过长,则递归的次数会容易超过数据库默认的递归最大次数,会报错。而且大量的递归
消费内存和执行效率不高,慎用。sqlserver中可以用hintOPTION(MAXRECURSION N)来处理这个问题。
--USE TEMPDB;
--GO
--CREATE TABLE MYTEST(ID INT,NAMELIST VARCHAR(200));
--INSERT INTO MYTEST VALUES(1,'A,B,C,D,E,F,G,H,I,J,K');
--INSERT INTO MYTEST VALUES(2,'X,Y,Z');
--INSERT INTO MYTEST VALUES(3,'QQ');
--SELECT * FROM MYTEST;
方法一代码如下:
WITH NUMS(N) AS(
SELECT ROW_NUMBER() OVER(ORDER BY OBJECT_ID) AS N FROM SYS.ALL_OBJECTS
)
SELECT ID,
SUBSTRING(
NAMELIST,
NUMS.N,
CHARINDEX(',',NAMELIST+',',N)-N
) AS NAME
FROM
MYTEST
JOIN
NUMS
ON
LEN(MYTEST.NAMELIST)>NUMS.N-1
AND SUBSTRING(','+MYTEST.NAMELIST+',',N,1)=','
ORDER BY ID, NAMELIST ,N
CTE方法拆分字符串的示例代码:
--CTE
WITH CTE AS
(
SELECT ID, 1 AS [START],CHARINDEX(',',NAMELIST+',') AS [END],NAMELIST FROM MYTEST
UNION ALL
SELECT ID,[END]+1 AS START,CHARINDEX(',',NAMELIST+',',[END]+1) AS [END],NAMELIST FROM CTE
WHERE CHARINDEX(',',NAMELIST+',',[END]+1)>0
)
SELECT ID,SUBSTRING(NAMELIST,START,[END]-[START]) AS [NAME] FROM CTE
ORDER BY ID,NAME OPTION(MAXRECURSION 1000);
由于oracle和sqlserver部分字符串函数实现不同,用oracle的函数可以写出更优雅简单的方法。欢迎大家尝试。
DB String Split sample的更多相关文章
- Java里String.split需要注意的用法
我们常常用String的split()方法去分割字符串,有两个地方值得注意: 1. 当分隔符是句号时("."),需要转义: 由于String.split是基于正则表达式来分割字符串 ...
- 字符串切分 String.Split 和 Regex.Split
当切割字符串的是单个字符时可使用String.Split string strSample="ProductID:20150215,Categroy:Food,Price:15.00&quo ...
- Java String.split()小点
java String.split(); 别的不说,单说其中一个问题,这个函数去切分空字符串时,得到的结果: public static void main(String[] args) {// St ...
- Lua 自定义函数string.split
function string.split(str, delimiter) if str==nil or str=='' or delimiter==nil then return ...
- C# string.Split对于换行符的分隔正确用法
C# string.Split对于换行符的分隔正确用法 tmpCase "11117144-8c91-4817-9b92-99ec2f9d784a\r\n23D95A26-012C-4332 ...
- String.split()用法以及特殊分隔符注意,ps:|
转载:http://www.cnblogs.com/mingforyou/archive/2013/09/03/3299569.html 在java.lang包中有String.split()方法,返 ...
- C# String.split()用法小结。String.Split 方法 (String[], StringSplitOptions)
split()首先是一个分隔符,它会把字符串按照split(' 字符')里的字符把字符串分割成数组,然后存给一个数组对象. 输出数组对象经常使用foreach或者for循环. 第一种方法 string ...
- java String.split()函数的用法分析
java String.split()函数的用法分析 栏目:Java基础 作者:admin 日期:2015-04-06 评论:0 点击: 3,195 次 在java.lang包中有String.spl ...
- Lua自己实现string.split功能
local function split(str, d) --str是需要查分的对象 d是分界符 local lst = { } local n = string.len(str)--长度 local ...
随机推荐
- 怎样用C#代码屏蔽任务管理器?
这是我在网上找的并多加了一些我自己需要的代码,经过我的测试,可以屏蔽任务管理器,但还有一些瑕疵. 首先,我在vs2012中新建一个项目,选择window下的window窗体应用程序,把窗体form1拉 ...
- C#初入串口通信(串行通信)总结
使用WinFrom来实现: 首先要知道串口通信协议以及原理 原理大概提一下:要自己翻阅看.(http://book.51cto.com/art/200911/162532.htm或者http://hi ...
- AC自动机---Keywords Search
题目网址:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=110773#problem/A Description In the moder ...
- jquery function Optional Arguments
1.javascript 选项散列对象 function Test(p1,p2,p3,p4,p5){ //do something } call: 参数可选 Test({ p1:value1, p2: ...
- Python for循环内部实现的一个sample
#!/usr/bin/env python # -*- coding: utf-8 -*- it = iter([1,2,3,4,5]) while True: try: x = next(it) p ...
- Snort - manual 笔记(二)
1.5 Packet Acquisition Snort 2.9 引入 DAQ 代替直接调用 libpcap . 有两种网卡特性会影响 Snort : "Large Receive Offl ...
- MQTT for UWP
老规矩,先简单介绍下MQTT: MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分.该协 ...
- vi编辑器常用配置
在终端下使用vim进行编辑时,默认情况下,编辑的界面上是没有显示行号.语法高亮度显示.智能缩进等功能的.为了更好的在vim下进行工作,需要手动设置一个配置文件:.vimrc. 在启动vim时,当前用户 ...
- Android开发, 如何看logcat
有如下log: android.view.InflateException: Binary XML file line #2: Error inflating class com.hankkin. ...
- 【原】xcode5.0升级5.1遇到的clang: error: unknown argument: '-fobj-arc'错误
XCODE5.0升到XCODE5.1后LLVM也从5.0升到5.1,工程报下面的错误了: clang: error: unknown argument: '-fobj-arc' [-Wunused-c ...