04. 字符串合并与拆分写法小结

原文:04. 字符串合并与拆分写法小结

一. 字符合并

if OBJECT_ID(‘ConcatStr‘) is not null
drop table ConcatStr
GO
create table ConcatStr
(
ID int,
Code varchar(10)
)
GO
insert into ConcatStr
select 1,‘XXX‘ union all
select 1,‘YYY‘ union all
select 2,‘PPP‘ union all
select 2,‘QQQ‘

要得到这样的结果:

ID Code
1 XXX,YYY
2 PPP,QQQ

1. 用游标

declare @t table(ID int, Code varchar(1000))
declare @id int
declare c cursor for
select distinct ID from ConcatStr
open c
fetch next from c into @id
while @@fetch_status=0
begin
declare @str varchar(max)
set @str = ‘‘
select @str = @str + ‘,‘ + Code from ConcatStr where ID = @id
insert into @t(ID, Code)
select @id,stuff(@str,1,1,‘‘)
fetch next from c into @id
end
close c
deallocate c
select * from @t

2. 用自定义函数

跟游标的方法类似,只是把逐个取的动作封装到函数里去了。
(1) 函数方法1

if OBJECT_ID(‘f_concat_str‘) is not null
drop function f_concat_str
GO
create function f_concat_str(@id int)
returns nvarchar(4000)
as
begin
declare @s nvarchar(4000)
set @s=‘‘
select @s = @s+‘,‘ + Code from ConcatStr where ID = @id
return (stuff(@s,1,1,‘‘))
--return (right(@s,len(@s)-1))
End

(2) 函数方法2,就是把函数1再简化

if OBJECT_ID(‘f_concat_str‘) is not null
drop function f_concat_str
GO
create function f_concat_str(@id int)
returns nvarchar(4000)
as
begin
declare @s nvarchar(4000)
--set @s=‘‘
--select @s = case when @s = ‘‘ then Code else @s + ‘,‘ + Code end
--from ConcatStr where ID = @id
select @s = isnull(@s + ‘,‘,‘‘) + Code from ConcatStr where ID = @id
return @s
end

调用函数1或者函数2

--select ID,dbo.f_concat_str(ID) as Code
--from ConcatStr
--group by ID
Select distinct ID, Code = dbo.f_concat_str(ID)
from ConcatStr

3. 利用静态的行列转换写法

给分组里的每行构造一个编号,行列转换后把列连接起来,编号多少个,取决于每个分组COUNT(1)的值。

SELECT ID,
       MAX(CASE WHEN num = 1 THEN Code ELSE ‘‘ END)
     + MAX(CASE WHEN num = 2 THEN ‘,‘ + Code ELSE ‘‘ END) AS Code
FROM (SELECT ID, Code,
      (SELECT COUNT(*)
         FROM dbo.ConcatStr AS t2
        WHERE t2.ID = t1.ID
          AND t2.Code <= t1.Code) AS num
FROM dbo.ConcatStr AS t1) AS t
GROUP BY ID;

4. 用FOR XML子句

(1) FOR XML AUTO
SQL Server 2000就有这个子句,不过OUTER APPLY是SQL Server 2005的语法。通常这种写法效率上不会比用函数快。

SELECT * FROM(SELECT DISTINCT ID FROM ConcatStr)A OUTER APPLY(SELECT Code= STUFF(REPLACE(REPLACE((
SELECT Code FROM ConcatStr N WHERE ID = A.ID FOR XML AUTO), ‘<N Code="‘, ‘,‘), ‘"/>‘, ‘‘), 1, 1, ‘‘))N

(2) FOR XML PATH

SQL Server 2005的新语法。

SELECT ID,
STUFF((SELECT ‘,‘ + Code
FROM dbo.ConcatStr AS t2
WHERE t2.ID = t1.ID
ORDER BY ID
FOR XML PATH(‘‘)), 1, 1, ‘‘) AS Code
FROM dbo.ConcatStr AS t1
GROUP BY ID;

二. 字符拆分

if not object_id(‘SplitStr‘) is null
drop table SplitStr
Go
create table SplitStr
(
Col1 int,
Col2 nvarchar(10)
)
insert SplitStr
select 1,N‘a,b,c‘ union all
select 2,N‘d,e‘ union all
select 3,N‘f‘
Go

要得到这样的结果:

Col1 Code
1 a
1 b
1 c
2 d
2 e
3 f

1. 使用数字辅助表

if object_id(‘Tempdb..#Num‘) is not null
drop table #Num
GO
select top 100 ID = Identity(int,1,1) into #Num
--也可用ROW_NUMBER()来生成
from syscolumns a,syscolumns b
GO
Select a.Col1,Col2=substring(a.Col2,b.ID,charindex(‘,‘,a.Col2+‘,‘,b.ID)-b.ID)
from SplitStr a,#Num b
where charindex(‘,‘,‘,‘+a.Col2,b.ID)=b.ID
--也可用substring(‘,‘+a.COl2,b.ID,1)=‘,‘

2. 使用CTE

with t(Col1, p1, p2)
as
(
select Col1, charindex(‘,‘,‘,‘+col2), charindex(‘,‘,Col2+‘,‘) + 1 from SplitStr
union all
select s.Col1, t.p2, charindex(‘,‘, s.Col2+‘,‘, t.p2) + 1
from SplitStr s join t on s.Col1 = t.Col1 where charindex(‘,‘, s.Col2+‘,‘, t.p2) > 0
)
--select * from t
select s.Col1, Col2 = substring(s.Col2+‘,‘, t.p1, t.p2-t.p1-1)
from SplitStr s join t on s.Col1 = t.Col1
order by s.Col1
option (maxrecursion 0)

3. 使用XML

SELECT A.Col1, B.Code
FROM(SELECT Col1, Code = CONVERT(XML,‘<root><v>‘ + REPLACE(Col2, ‘,‘, ‘</v><v>‘) + ‘</v></root>‘) FROM SplitStr) A
OUTER APPLY(SELECT Code = N.v.value(‘.‘, ‘varchar(100)‘) FROM A.Code.nodes(‘/root/v‘) N(v)) B

04. 字符串合并与拆分写法小结,布布扣,bubuko.com

时间: 2024-10-17 02:58:29

04. 字符串合并与拆分写法小结的相关文章

Goldengate进程的合并与拆分规范

Goldengate抽取进程的合并与拆分原则 1.    文档综述 1.1.  文档说明 本文档描述了对GoldenGate的抽取进程进行拆分和合并的基本原则和详细步骤.  1.2.  读者范围 本文档主要容灾相关人员.纳入数据级容灾范围的应用系统相关人员使用,在Goldengate实施.运维的整个生命周期中,必须严格遵循本系列文档. 1.3.  术语说明 序号 完整说法 缩略说法 1 GoldenGate GG或OGG         2.      抽取进程的拆分 2.1.  拆分原则  

字符串-04. 字符串逆序

1 /* 2 * Main.c 3 * D4-字符串-04. 字符串逆序 4 * Created on: 2014年8月19日 5 * Author: Boomkeeper 6 *******测试通过****** 7 */ 8 9 #include <stdio.h> 10 11 int main(void){ 12 13 char str[80]; 14 15 gets(str); 16 17 int i; 18 for(i=0;i<80;i++){ 19 if(str[i]=='\0

华为OJ:字符串合并处理

字符串合并处理 按照指定规则对输入的字符串进行处理. 详细描述: 将输入的两个字符串合并. 对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序.这里的下标意思是字符在字符串中的位置. 对排训后的字符串进行操作,如果字符为‘0’——‘9’或者‘A’——‘F’或者‘a’——‘f’,则对他们所代表的16进制的数进行BIT倒序的操作,并转换为相应的大写字符.如字符为‘4’,为0100b,则翻转后为0010b,也就是2.转换后的字符为‘2’: 如字符为‘7’,为0111b

06. 父子节点(树)遍历写法小结

原文:06. 父子节点(树)遍历写法小结 对于树/图的遍历,通常有2种算法来实现:迭代(Iteration)和递归(Recursion),迭代是利用循环反复取值/赋值的过程:递归则是反复自己调用自己来获得最终结果.SQL Server里的递归有32层嵌套限制,目的在于防止代码进入死循环,除非使用提示OPTION (MAXRECURSION 0). 测试数据: if OBJECT_ID('city') is not null drop table city GO create table city

03. 行列转换写法小结

原文:03. 行列转换写法小结 行列转换,通常有2种方法,一是CASE WHEN/UNION:一是PIVOT/UNPIVOT.对于行值或列数不固定的情况,需要用动态SQL. 一. 行转列 --drop table RowToCol create table RowToCol ( ID int, Code varchar(10), Value int ) Go insert RowToCol select 1,'Item1',1000 union all select 1,'Item2',1000

07. 分页写法小结

原文:07. 分页写法小结 分页的实现方式有这几种:1. 在前台程序中,将所有的记录都读到本地,前台程序通过游标在数据集中上下移动,数据量大的话,性能很差,不推荐:2. 前台程序请求某一页数据时,到数据库做一次查询,返回符合条件的相应记录,这也是目前常用的方法:3. 对方式2的改进,当请求某一页时,同时将前后几页一并返回,用户翻页时就不需要反复请求数据库了. 对于2,3的实现,随着SQL Server版本的升级,常用的方法有三种:TOP,ROW_NUMBER,OFFSET/FETCH NEXT.

字符串-04. 字符串逆序(15)

输入一个字符串,对该字符串进行逆序,输出逆序后的字符串. 输入格式: 输入在一行中给出一个不超过80个字符长度的.以回车结束的非空字符串. 输出格式: 在一行中输出逆序后的字符串. 输入样例: Hello World! 输出样例: !dlroW olleH import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String[] args) { Scann

各种字符串合并处理示例.

--各种字符串合并处理示例.sql SQL code--各种字符串分函数 --3.3.1 使用游标法进行字符串合并处理的示例.--处理的数据CREATE TABLE tb(col1 varchar(10),col2 int)INSERT tb SELECT 'a',1UNION ALL SELECT 'a',2UNION ALL SELECT 'b',1UNION ALL SELECT 'b',2UNION ALL SELECT 'b',3 --合并处理--定义结果集表变量DECLARE @t

SQL查询语句 group by后, 字符串合并

原文:SQL查询语句 group by后, 字符串合并 合并列值 --******************************************************************************************* 表结构,数据如下: id value ----- ------ 1 aa 1 bb 2 aaa 2 bbb 2 ccc 需要得到结果: id values ------ ----------- 1 aa,bb 2 aaa,bbb,ccc 即:gr