SQL函数类似程序中split的方法,来分割某一个字段
2010-10-23 14:13
387 查看
类似于 aa/bb/cc/dd/ee/ff 得到 aa cc ee
aaa/bbb/ccc/ddd/eee/ff/ggg 得到 aaa ccc eee
split后取得斜杠之间的位置是固定的
以下是参考函数
1:==================================================================
create table isc_catalog(nid int, npid int, ccategory char(10))
insert into isc_catalog values('1', '0', '中国')
insert into isc_catalog values('2', '1', '湖南省')
insert into isc_catalog values('3', '1', '广东省')
insert into isc_catalog values('4', '3', '广州市')
insert into isc_catalog values('5', '2', '长沙市')
insert into isc_catalog values('6', '4', '白云区')
insert into isc_catalog values('7', '5', '雨花区')
insert into isc_catalog values('8', '2', '娄底市')
insert into isc_catalog values('9', '1', '北京市')
insert into isc_catalog values('10', '6', '白云小区A')--新增一条记录
go
create function F_test(@nid int)
returns nvarchar(1000)
as
begin
declare @s nvarchar(1000),@npid int
select @s=rtrim(ccategory),@npid=npid from isc_catalog where nid=@nid
if @s is null
return null
return isnull(dbo.F_test(@npid)+',','')+@s --用,分隔
--@s+isnull('.'+dbo.F_test(@npid),'')
end
go
--加一个分隔函数:
create function F_split(
@s varchar(8000), --包含多个数据项的字符串
@pos int, --要获取的数据项的位置
@split varchar(10) --数据分隔符
)RETURNS varchar(100)
AS
BEGIN
IF @s IS NULL RETURN(NULL)
DECLARE @splitlen int --分隔符长度
SELECT @splitlen=LEN(@split+'a')-2
WHILE @pos>1 AND charindex(@split,@s+@split)>0
SELECT @pos=@pos-1,
@s=stuff(@s,1,charindex(@split,@s+@split)+@splitlen,'')
RETURN(nullif(left(@s,charindex(@split,@s+@split)-1),''))
END
GO
select
dbo.F_split(dbo.F_test(nid),1,','),
coalesce(dbo.F_split(dbo.F_test(nid),2,','),dbo.F_split(dbo.F_test(nid),1,',')),
coalesce(dbo.F_split(dbo.F_test(nid),3,','),dbo.F_split(dbo.F_test(nid),2,',')),
coalesce(dbo.F_split(dbo.F_test(nid),4,','),dbo.F_split(dbo.F_test(nid),3,','),dbo.F_split(dbo.F_test(nid),2,',')),
coalesce(dbo.F_split(dbo.F_test(nid),5,','),dbo.F_split(dbo.F_test(nid),4,','),dbo.F_split(dbo.F_test(nid),3,','),dbo.F_split(dbo.F_test(nid),2,','))
from
isc_catalog a
where
not exists(select 1 from isc_catalog where npid=a.nid)
/*
中国 湖南省 长沙市 雨花区 雨花区
中国 湖南省 娄底市 娄底市 娄底市
中国 北京市 北京市 北京市 北京市
中国 广东省 广州市 白云区 白云小区A
*/
--drop function F_split,F_test
--drop table isc_catalog ===================================================================
2:================================================================
create FUNCTION dbo.splitString
(
@string VARCHAR(MAX),
@delimiter CHAR(1),
@rep int =1
)
RETURNS varchar(10)
BEGIN
DECLARE @start INT, @end INT
SELECT @start = 1, @end = CHARINDEX(@delimiter, @string)
declare @ic int
set @ic = 1
WHILE @start < LEN(@string) + 1 BEGIN
if(@ic = @rep) return substring(@string, @start, @end-@start)
IF @end = 0
SET @end = LEN(@string) + 1
SET @start = @end + 1
SET @end = CHARINDEX(@delimiter, @string, @start)
set @ic = @ic + 1
END
return null
END
create table ta(col varchar(30))
insert into ta values('[ad][ba][daf]')
insert into ta values('[erf][afda][dasfasdf]')
insert into ta values('[fas][fase][reb]')
select dbo.SplitString(col, ']', 1)+']' as col1,
dbo.SplitString(col, ']', 2)+']' as col2,
dbo.SplitString(col, ']', 3)+']' as col3
from ta
col1 col2 col3
----------- ----------- -----------
[ad] [ba] [daf]
[erf] [afda] [dasfasdf]
[fas] [fase] [reb]
====================================================================
3:=================================================================
IF EXISTS ( SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE SPECIFIC_NAME = N'Split' )
DROP FUNCTION Split
GO
CREATE FUNCTION dbo.Split
(
@ItemList VARCHAR(4000),
@delimiter VARCHAR(10)
)
RETURNS @IDTable TABLE (Item VARCHAR(50))
AS
BEGIN
WHILE CHARINDEX(@delimiter, @ItemList)>0
BEGIN
INSERT @IDTable SELECT LEFT(@ItemList,CHARINDEX(@delimiter,@ItemList)-1)
SET @ItemList=STUFF(@ItemList,1,CHARINDEX(@delimiter,@ItemList),'')
END
INSERT @IDTable SELECT @ItemList
RETURN
END
GO
SELECT * FROM dbo.SPLIT('aaaa,bbb,ccc,eee',',')
GO
=====================================================================
4:==================================================================
create function dbo.fn_split
(
@inputstr varchar(8000),
@seprator varchar(10)
)
returns @temp table (a varchar(200))
as
begin
declare @i int
set @inputstr = rtrim(ltrim(@inputstr))
set @i = charindex(@seprator, @inputstr)
while @i >= 1
begin
insert @temp values(left(@inputstr, @i - 1))
set @inputstr = substring(@inputstr, @i + 1, len(@inputstr) - @i)
set @i = charindex(@seprator, @inputstr)
end
if @inputstr <> '\'
insert @temp values(@inputstr)
return
end
go
--调用
declare @s varchar(1000)
set @s='1,2,3,4,5,6,7,8,55'
select * from dbo.fn_split(@s,',')
drop function dbo.fn_split
=====================================================================
5:==================================================================
CREATE FUNCTION f_splitSTR(
@s varchar(8000), --待分拆的字符串
@split varchar(10) --数据分隔符
)RETURNS TABLE
AS
RETURN(
SELECT col=CAST(SUBSTRING(@s,ID,CHARINDEX(@split,@s+@split,ID)-ID) as varchar(100))
FROM tb_splitSTR
WHERE ID<=LEN(@s+'a')
AND CHARINDEX(@split,@split+@s,ID)=ID)
GO
=====================================================================
aaa/bbb/ccc/ddd/eee/ff/ggg 得到 aaa ccc eee
split后取得斜杠之间的位置是固定的
以下是参考函数
1:==================================================================
create table isc_catalog(nid int, npid int, ccategory char(10))
insert into isc_catalog values('1', '0', '中国')
insert into isc_catalog values('2', '1', '湖南省')
insert into isc_catalog values('3', '1', '广东省')
insert into isc_catalog values('4', '3', '广州市')
insert into isc_catalog values('5', '2', '长沙市')
insert into isc_catalog values('6', '4', '白云区')
insert into isc_catalog values('7', '5', '雨花区')
insert into isc_catalog values('8', '2', '娄底市')
insert into isc_catalog values('9', '1', '北京市')
insert into isc_catalog values('10', '6', '白云小区A')--新增一条记录
go
create function F_test(@nid int)
returns nvarchar(1000)
as
begin
declare @s nvarchar(1000),@npid int
select @s=rtrim(ccategory),@npid=npid from isc_catalog where nid=@nid
if @s is null
return null
return isnull(dbo.F_test(@npid)+',','')+@s --用,分隔
--@s+isnull('.'+dbo.F_test(@npid),'')
end
go
--加一个分隔函数:
create function F_split(
@s varchar(8000), --包含多个数据项的字符串
@pos int, --要获取的数据项的位置
@split varchar(10) --数据分隔符
)RETURNS varchar(100)
AS
BEGIN
IF @s IS NULL RETURN(NULL)
DECLARE @splitlen int --分隔符长度
SELECT @splitlen=LEN(@split+'a')-2
WHILE @pos>1 AND charindex(@split,@s+@split)>0
SELECT @pos=@pos-1,
@s=stuff(@s,1,charindex(@split,@s+@split)+@splitlen,'')
RETURN(nullif(left(@s,charindex(@split,@s+@split)-1),''))
END
GO
select
dbo.F_split(dbo.F_test(nid),1,','),
coalesce(dbo.F_split(dbo.F_test(nid),2,','),dbo.F_split(dbo.F_test(nid),1,',')),
coalesce(dbo.F_split(dbo.F_test(nid),3,','),dbo.F_split(dbo.F_test(nid),2,',')),
coalesce(dbo.F_split(dbo.F_test(nid),4,','),dbo.F_split(dbo.F_test(nid),3,','),dbo.F_split(dbo.F_test(nid),2,',')),
coalesce(dbo.F_split(dbo.F_test(nid),5,','),dbo.F_split(dbo.F_test(nid),4,','),dbo.F_split(dbo.F_test(nid),3,','),dbo.F_split(dbo.F_test(nid),2,','))
from
isc_catalog a
where
not exists(select 1 from isc_catalog where npid=a.nid)
/*
中国 湖南省 长沙市 雨花区 雨花区
中国 湖南省 娄底市 娄底市 娄底市
中国 北京市 北京市 北京市 北京市
中国 广东省 广州市 白云区 白云小区A
*/
--drop function F_split,F_test
--drop table isc_catalog ===================================================================
2:================================================================
create FUNCTION dbo.splitString
(
@string VARCHAR(MAX),
@delimiter CHAR(1),
@rep int =1
)
RETURNS varchar(10)
BEGIN
DECLARE @start INT, @end INT
SELECT @start = 1, @end = CHARINDEX(@delimiter, @string)
declare @ic int
set @ic = 1
WHILE @start < LEN(@string) + 1 BEGIN
if(@ic = @rep) return substring(@string, @start, @end-@start)
IF @end = 0
SET @end = LEN(@string) + 1
SET @start = @end + 1
SET @end = CHARINDEX(@delimiter, @string, @start)
set @ic = @ic + 1
END
return null
END
create table ta(col varchar(30))
insert into ta values('[ad][ba][daf]')
insert into ta values('[erf][afda][dasfasdf]')
insert into ta values('[fas][fase][reb]')
select dbo.SplitString(col, ']', 1)+']' as col1,
dbo.SplitString(col, ']', 2)+']' as col2,
dbo.SplitString(col, ']', 3)+']' as col3
from ta
col1 col2 col3
----------- ----------- -----------
[ad] [ba] [daf]
[erf] [afda] [dasfasdf]
[fas] [fase] [reb]
====================================================================
3:=================================================================
IF EXISTS ( SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE SPECIFIC_NAME = N'Split' )
DROP FUNCTION Split
GO
CREATE FUNCTION dbo.Split
(
@ItemList VARCHAR(4000),
@delimiter VARCHAR(10)
)
RETURNS @IDTable TABLE (Item VARCHAR(50))
AS
BEGIN
WHILE CHARINDEX(@delimiter, @ItemList)>0
BEGIN
INSERT @IDTable SELECT LEFT(@ItemList,CHARINDEX(@delimiter,@ItemList)-1)
SET @ItemList=STUFF(@ItemList,1,CHARINDEX(@delimiter,@ItemList),'')
END
INSERT @IDTable SELECT @ItemList
RETURN
END
GO
SELECT * FROM dbo.SPLIT('aaaa,bbb,ccc,eee',',')
GO
=====================================================================
4:==================================================================
create function dbo.fn_split
(
@inputstr varchar(8000),
@seprator varchar(10)
)
returns @temp table (a varchar(200))
as
begin
declare @i int
set @inputstr = rtrim(ltrim(@inputstr))
set @i = charindex(@seprator, @inputstr)
while @i >= 1
begin
insert @temp values(left(@inputstr, @i - 1))
set @inputstr = substring(@inputstr, @i + 1, len(@inputstr) - @i)
set @i = charindex(@seprator, @inputstr)
end
if @inputstr <> '\'
insert @temp values(@inputstr)
return
end
go
--调用
declare @s varchar(1000)
set @s='1,2,3,4,5,6,7,8,55'
select * from dbo.fn_split(@s,',')
drop function dbo.fn_split
=====================================================================
5:==================================================================
CREATE FUNCTION f_splitSTR(
@s varchar(8000), --待分拆的字符串
@split varchar(10) --数据分隔符
)RETURNS TABLE
AS
RETURN(
SELECT col=CAST(SUBSTRING(@s,ID,CHARINDEX(@split,@s+@split,ID)-ID) as varchar(100))
FROM tb_splitSTR
WHERE ID<=LEN(@s+'a')
AND CHARINDEX(@split,@split+@s,ID)=ID)
GO
=====================================================================
相关文章推荐
- SQL函数类似程序中split的方法,来分割某一个字段
- plsql 类似Java中的split方法 字符串分割
- 一个比String.split分割速度更快的分割方法
- 一个案例帮你理解java正则表达式split分割方法
- 分享一个 Java String split 快速分割的方法
- 多个.Net程序共用同一个config文件的方法
- csplit命令_Linux csplit 命令用法详解:将一个大文件分割成小的碎片文件
- Java中一个方法字节码的长度会影响程序并发下的性能?
- Mysql中的字符串拆分方法 (类似java中split()与PaAdmin库中的split_part()函数)
- 一个可以禁用USB存储设备的程序(SetupAPI的使用方法)
- c#中Split分割字符串的几种方法
- 实验1_了解C程序的运行环境和运行一个C程序的方法
- 在启动脚本中一般使用类似如下的命令执行一个Java程序
- 让程序只运行一个实例的方法
- ArcMap中用python的split方法提取字段的值
- 使用Eclipse创建一个Android程序方法
- 使用Tessnet2_32.dll报未能加载文件或程序集或它的某一个依赖项。试图加载格式不正确的程序解决方法
- Matlab中,让程序自动处理类似A1,A2,A3变量的方法。
- PHP将二维数组某一个字段相同的数组合并起来的方法
- 一个显为人知的木马随程序启动的方法