有一个表,里面第三列的数据都是这样的 aaa|bbbb|cccc|dddd|....
我现在想把整个表里面的数据select出来,新增两个显示,
第四列的内容为 原表第三列内容中bbbb的内容,
第五列的内容为 原表第三列cccc的内容。相当于第四列过滤一个|,把第一个|和第二个|中间的内容显示出来,
相当于第五列过滤二个|,把第二个|和第三个|中间的内容显示出来请问有什么好的办法吗?
我现在想把整个表里面的数据select出来,新增两个显示,
第四列的内容为 原表第三列内容中bbbb的内容,
第五列的内容为 原表第三列cccc的内容。相当于第四列过滤一个|,把第一个|和第二个|中间的内容显示出来,
相当于第五列过滤二个|,把第二个|和第三个|中间的内容显示出来请问有什么好的办法吗?
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_GetStr]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_GetStr]
GO
--分段截取函数
CREATE FUNCTION dbo.f_GetStr(
@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(ISNULL(LEFT(@s,CHARINDEX(@split,@s+@split)-1),''))
END
GOselect dbo.f_GetStr('2∮11∮10∮09∮10∮13∮786∮91.93∮69∮100.00 ',7,'∮')
/*
----------------------------------------------------------------------------------------------------
786(1 個資料列受到影響)
然后用PARSENAME 取出需要的段内容
left(right([第三列],len([第三列])-charindex('|',[第三列])),charindex('|',right([第三列],len([第三列])-charindex('|',[第三列]))-1)
select parsename('192.168.2.23',4) --得到 192
into #tmp
from CCC
goinsert #tmp
select A,B,C,substring(right(note,len(note)-charindex('|',note)),1,charindex('|',right(note,len(note)-charindex('|',note)))-1),'',
substring(note,charindex('|',note) + 1,char_length(note)- charindex('|',note))
from CCCcreate index i_0 on #tmp (A,B,C)update #tem
set E = substring(right(note,len(note)-charindex('|',note)),1,charindex('|',right(note,len(note)-charindex('|',note)))-1)select A,B,C,D,E
from #tmp
into #tmp
from CCC
goinsert #tmp
select A,B,C,substring(right(note,len(note)-charindex('|',note)),1,charindex('|',right(note,len(note)-charindex('|',note)))-1),'',
substring(note,charindex('|',note) + 1,char_length(note)- charindex('|',note))
from CCCcreate index i_0 on #tmp (A,B,C)update #tmp
set E = substring(right(note,len(note)-charindex('|',note)),1,charindex('|',right(note,len(note)-charindex('|',note)))-1)select A,B,C,D,E
from #tmp
不知道效率如何。上面那个贴错了。
alter FUNCTION f_get_split
(
@Col varchar(2000),
@i int
)
RETURNS varchar(50)
AS
BEGIN
declare @result varchar(50)select @result = name
from
(
select
id = row_number() over(order by getdate()),
substring(@Col,number,charindex('|',@Col,number)-number) as name
from master..spt_values
where type = 'p'
and number < len(@Col)
and charindex('|','|'+@Col,number) = number
)a where id = @i
return @resultEND
GO