有一个表,里面第三列的数据都是这样的  aaa|bbbb|cccc|dddd|....
我现在想把整个表里面的数据select出来,新增两个显示,
第四列的内容为 原表第三列内容中bbbb的内容,
第五列的内容为 原表第三列cccc的内容。相当于第四列过滤一个|,把第一个|和第二个|中间的内容显示出来,
相当于第五列过滤二个|,把第二个|和第三个|中间的内容显示出来请问有什么好的办法吗?

解决方案 »

  1.   

    --轉老大
    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 個資料列受到影響)
      

  2.   

    给你个思路,如果段数相同的话把|替换成.
    然后用PARSENAME 取出需要的段内容
      

  3.   

    第四列:
    left(right([第三列],len([第三列])-charindex('|',[第三列])),charindex('|',right([第三列],len([第三列])-charindex('|',[第三列]))-1)
      

  4.   

    select parsename('192.168.2.23',1) --得到 23
    select parsename('192.168.2.23',4) --得到 192
      

  5.   

    select parsename(replace('192|168|2|23','|','.'),1) --得到 23
      

  6.   

    note数据都是这样的 aaa|bbbb|cccc|dddd|....我没用解析函数了,简单的处理了一下。select A, B, C, C as D, C as E, note
    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
      

  7.   

    我没用解析函数了,简单的处理了一下。select A, B, C, C as D, C as E, note
    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
    不知道效率如何。上面那个贴错了。
      

  8.   


    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