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

由于业务需求,我们可能会把一串以分割符字符串数据放到一个字段,如我们在客户端处理拆分是很简单的,不过这样做效果不太好,怎么用SQL SERVER 2008 来解决这件事件哪?

方案1

用SQL SERVER XML 功能来解决

1 ----> 生成测试数据: @T2  DECLARE @T TABLE (id INT,Col1  VARCHAR(50),Col2 VARCHAR(50))3  INSERT INTO @T4  SELECT 1,‘卸货费‘,‘运输车队业务, 客服接单业务‘ 5  UNION ALL6  SELECT 2,‘报关费‘,‘报关业务、客服接单业务‘
----SQL查询如下:

SELECT     T.id,    A.x.value(‘.‘,‘varchar(10)‘) AS code,    B.x.value(‘.‘,‘varchar(10)‘) AS code2FROM (    SELECT *,doc = CONVERT(xml,‘<v>‘+REPLACE(code,‘,‘,‘</v><v>‘)+‘</v>‘),         doc2=CONVERT(xml,‘<v>‘+REPLACE(code2,‘,‘,‘</v><v>‘)+‘</v>‘)    FROM @T) AS T    CROSS APPLY doc.nodes(‘//v‘) AS A(x)    CROSS APPLY doc2.nodes(‘//v‘) AS B(x)

方案2

用SQL SERVER WITH 递归查询

 1 WITH    roy 2           AS ( SELECT   Col1 , 3                         COl2 = CAST(LEFT(Col2, CHARINDEX(‘,‘, Col2 + ‘,‘) - 1) AS NVARCHAR(100)) , 4                         Split = CAST(STUFF(COl2 + ‘,‘, 1, 5                                            CHARINDEX(‘,‘, Col2 + ‘,‘), ‘‘) AS NVARCHAR(100)) 6                FROM     Tab 7                UNION ALL 8                SELECT   Col1 , 9                         COl2 = CAST(LEFT(Split, CHARINDEX(‘,‘, Split) - 1) AS NVARCHAR(100)) ,10                         Split = CAST(STUFF(Split, 1, CHARINDEX(‘,‘, Split), ‘‘) AS NVARCHAR(100))11                FROM     Roy12                WHERE    split > ‘‘13              )14     SELECT  COl1 ,15             COl216     FROM    roy17     ORDER BY COl118 OPTION  ( MAXRECURSION 0 )

时间: 2024-10-15 18:43:49

SQL将一个字段内用逗号分隔的内容分成多条记录的相关文章

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

CREATE TABLE [dbo].[testtb]( [namea] [varchar](100) NULL, [desca] [varchar](50) NULL ) ON [PRIMARY] insert into testtb values('A1,A2,','AAAAA') insert into testtb values('A3,','BBBBBB') insert into testtb values('A5,A8,A9,','AAACCAA') insert into tes

Hive 组内计无重复数,追加每条记录后面

今天无意中碰到一个很简单的计算逻辑,但是用hive想了一大会才实现. 示例表数据: 需求逻辑: 给每条记录追加一个字段,用于统计按照p1和p2字段分组后,每个组中的num的数目(去重后的count). 示例结果: Mysql 超级简单的一句: select id, num, p1, p2, count(distinct num) over (PARTITION by p1,p2) as f from test_z; Hive里 会报distinct有问题,去掉的话,明显与要求逻辑不符合啊. 想了

[mysql] 先按某字段分组再取每组中前N条记录

From: http://blog.chinaunix.net/uid-26729093-id-4294287.html 请参考:http://bbs.csdn.net/topics/330021260 create table t2 (    id int primary key,    gid    char,    col1    int,    col2    int) engine=myisam; insert into t2 values (1,'A',31,6),(2,'B',25

SQL:多表关联取最大日期的那条记录

作者:iamlasong 1.需求 两个表,投递记录表和封发开拆记录表,现在想知道投递日期距最后一次封发日期天数分布情况. 对这个需求,需要先查询出投递明细,同时要知道对应的邮件最后一次封发情况,如机构.日期等 2.明细查询 考虑到一天可能封发多次,所以取日期和时间都是最大的那条,语句如下: select * from tb_evt_bag_mail_rela a,tb_evt_dlv c , tb_jg d where a.mail_num=c.mail_num and a.bag_actn_

SQL Server基础操作(此随笔仅作为本人学习进度记录九!--游标)

游标就是存储结果集,将从指定表中查询出符合条件的记录,组成了结果集,然后把它存到游标当中,如果要显示游标中的哪一条记录 游标(游动的标识) !!!!非常重要的知识点,比较难理解 !!!游标提供了对表中的数据检索的一种方式,一种灵活操作手段,只是检索表中数据的一种方式. 在操作的时候也可以把游标看做是一个数据库对象.就好像视图一样. 它也是依赖于T-sql语句来进行查询,把查询出来符合条件的记录,不是一下全部显示出来,可以一条记录一条记录的把它显示出来. 它每次只提取一条记录,每次只显示一条记录.

SQL Server基础操作(此随笔仅作为本人学习进度记录)

create database LtsDatabase \\创建数据库 on ( name=LtsDatabase_data,\\数据库名称 filename='d:\temp\LtsDatabase_data.mbf',\\文件所在位置,扩展名.mdf size=6, \\数据库文件初始化大小 maxsize=12, \\数据库文件最大值可以为多大 filegrowth=10% \\数据库超过现有的尺寸后,数据库增长率 ) log on \\对事物日志的描述 ( name=LtsDatabas

如何替换B字段内包含A字段的那部分内容

Customer表A字段  varchar(50)     内容(客户姓名)B字段  varchar(1000)   内容(其他字符...客户姓名...其他字符)需要达到效果:将B字段中的客户姓名替换掉B字段内容替换成(其他字符......其他字符)如何将每个数据行内的B字段内所有符合A字段内容的文字部分替换成空隔或其他字符?UPDATE Customer SET B = replace(B, A, ''); Access语句:UPDATE Content SET v_cate_2 = repl

SQL 把表中字段存储的逗号隔开内容转换成列表形式

原文:[原创]SQL 把表中字段存储的逗号隔开内容转换成列表形式 我们日常开发中,不管是表设计问题抑或是其他什么原因,或多或少都会遇到一张表中有一个字段存储的内容是用逗号隔开的列表. 具体效果如下图: ------> 从左边图转换成右边图,像这种需求,我们难免会遇到. 今天我写了个存储过程来解决这种问题.主要方式是利用master..spt_values表. 具体存储过程如下: -- Author: LHM -- Create date: 2015-01-10 -- Description: 把

[原创]SQL表值函数:把用逗号分隔的字符串转换成表格数据

  我们日常开发过程中,非常常见的一种需求,把某一个用逗号或者/或者其他符号作为间隔的字符串分隔成一张表数据. 在前面我们介绍了 [原创]SQL 把表中字段存储的逗号隔开内容转换成列表形式,当然按照这种方式转变一下也是可以实现的,但是我这里有以前我一直使用的另外一种方式,也记录一下吧. 依照惯例,我们首先来看看效果. 调用:SELECT Id FROM [Fn_StringSplitToTable]('1,12,36,65,58,56,DF',',') 具体函数如下: -- ==========