以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的更多相关文章

  1. Java里String.split需要注意的用法

    我们常常用String的split()方法去分割字符串,有两个地方值得注意: 1. 当分隔符是句号时("."),需要转义: 由于String.split是基于正则表达式来分割字符串 ...

  2. 字符串切分 String.Split 和 Regex.Split

    当切割字符串的是单个字符时可使用String.Split string strSample="ProductID:20150215,Categroy:Food,Price:15.00&quo ...

  3. Java String.split()小点

    java String.split(); 别的不说,单说其中一个问题,这个函数去切分空字符串时,得到的结果: public static void main(String[] args) {// St ...

  4. Lua 自定义函数string.split

    function string.split(str, delimiter)    if str==nil or str=='' or delimiter==nil then        return ...

  5. C# string.Split对于换行符的分隔正确用法

    C# string.Split对于换行符的分隔正确用法 tmpCase "11117144-8c91-4817-9b92-99ec2f9d784a\r\n23D95A26-012C-4332 ...

  6. String.split()用法以及特殊分隔符注意,ps:|

    转载:http://www.cnblogs.com/mingforyou/archive/2013/09/03/3299569.html 在java.lang包中有String.split()方法,返 ...

  7. C# String.split()用法小结。String.Split 方法 (String[], StringSplitOptions)

    split()首先是一个分隔符,它会把字符串按照split(' 字符')里的字符把字符串分割成数组,然后存给一个数组对象. 输出数组对象经常使用foreach或者for循环. 第一种方法 string ...

  8. java String.split()函数的用法分析

    java String.split()函数的用法分析 栏目:Java基础 作者:admin 日期:2015-04-06 评论:0 点击: 3,195 次 在java.lang包中有String.spl ...

  9. Lua自己实现string.split功能

    local function split(str, d) --str是需要查分的对象 d是分界符 local lst = { } local n = string.len(str)--长度 local ...

随机推荐

  1. C#中部分方法返回值类型为什么只能是void?

    这个问题答案选至<C#入门经典> 如果方法具有返回类型,那就可以作为表达式的一部分: x=Manipulate(y,z); 如果没有给部分方法提供实现代码,编译器就会在使用该方法的所有地方 ...

  2. ToDoList:一款非常优秀的任务管理软件 —— 工具类

    ToDoList是一款非常优秀的任务管理软件,用户可以方便地组织和安排计划.这是一个开源的项目,很多细节都考虑到了,推荐大家使用~ ToDoList 帮你把要做的事情列出来,一项一项,类似思维导图. ...

  3. php中的引用类型和值类型

    PHP中的四种简单类型和复杂类型array都是值类型.同类型间赋值传递的是值,即创建一个副本给新变量. 例如: $int1 = 123; $int2 = $int1;//直接传递的是值,只是做了一个叫 ...

  4. Spring 接口代理 类代理

    1.Question Description : when you use @Transactional annotation and @RequiresPermissions annotation ...

  5. eclipse中的web项目路径和发布好的项目路径

    现在企业开发中,我们都会创建一个javaWeb工程,在eclipse中指的是新建一个dynamic web project,创建完工程之后,我们在IDE中大体看到如下的工程目录: 我们主要关心的文件夹 ...

  6. RCA端子颜色(红、白、黄)

    RCA端子(红白黄)的作用: 黄:视频 红:左声道 白:右声道 RCA为两口插头,红色代表左声道,白色为右声道,3.5(AUX口)同样为立体声接头,虽然它只有一个端口,同样也具有左右声道分开传输的功能 ...

  7. (七)play之yabe项目【CRUD】

    (七)play之yabe项目[CRUD] 博客分类: 框架@play framework    增加CRUD功能 使用CRUD能干嘛?----> 在页面对模型进行增删改查操作,这样有什么实际意义 ...

  8. 使用WCF对外提供接口

    本篇将通过WCF以webservices的方式对外提供接口.同时使用NUnit对webservices中的方法进行单元测试. 开发契约 contract Contract项目为类库项目,该项目下会包含 ...

  9. 用jq编码解码一个url地址

    介绍一下编码解码函数对 1.    escape /unescape   主要用于汉字编码,返回字符的unicode编码值, 对“+”不能编码 2.     encodeURI / decodeURI ...

  10. CSS3中的calc()

    什么是calc()? calc是英文单词calculate(计算)的缩写,是css3的一个新增的功能; MDN的解释为可以用在任何长度,数值,时间,角度,频率等处; /* property: calc ...