zoukankan      html  css  js  c++  java
  • sql server 模拟数组【转】

    sql server 模拟数组


    --SQL对字符串的处理能力比较弱,比如我要循环遍历象1,2,3,4,5这样的字符串,如果用数组的话,遍历很简单,但是T-SQL不支持数组,所以处理下来比较麻烦。下边的函数,实现了象数组一样去处理字符串。
    一,用临时表作为数组
    create function f_split(@c varchar(2000),@split varchar(2))
    returns @t table(col varchar(20))
    as
    begin

    while(charindex(@split,@c)<>0)
    begin
    insert @t(col) values (substring(@c,1,charindex(@split,@c)-1))
    set @c = stuff(@c,1,charindex(@split,@c),'')
    end
    insert @t(col) values (@c)
    return
    end
    go

    select * from dbo.f_split('dfkd,dfdkdf,dfdkf,dffjk',',')

    drop function f_split
    col
    --------------------
    dfkd
    dfdkdf
    dfdkf
    dffjk

    (所影响的行数为 4 行)


    二、按指定符号分割字符串,返回分割后的元素个数,方法很简单,就是看字符串中存在多少个分隔符号,然后再加一,就是要求的结果。
    CREATE function Get_StrArrayLength
    (
    @str varchar(1024), --要分割的字符串
    @split varchar(10) --分隔符号
    )
    returns int
    as
    begin
    declare @location int
    declare @start int
    declare @length int

    set @str=ltrim(rtrim(@str))
    set @location=charindex(@split,@str)
    set @length=1
    while @location<>0
    begin
    set @start=@location+1
    set @location=charindex(@split,@str,@start)
    set @length=@length+1
    end
    return @length
    end
    调用示例:select dbo.Get_StrArrayLength('78,1,2,3',',')
    返回值:4

    三、按指定符号分割字符串,返回分割后指定索引的第几个元素,象数组一样方便
    CREATE function Get_StrArrayStrOfIndex
    (
    @str varchar(1024), --要分割的字符串
    @split varchar(10), --分隔符号
    @index int --取第几个元素
    )
    returns varchar(1024)
    as
    begin
    declare @location int
    declare @start int
    declare @next int
    declare @seed int

    set @str=ltrim(rtrim(@str))
    set @start=1
    set @next=1
    set @seed=len(@split)

    set @location=charindex(@split,@str)
    while @location<>0 and @index>@next
    begin
    set @start=@location+@seed
    set @location=charindex(@split,@str,@start)
    set @next=@next+1
    end
    if @location =0 select @location =len(@str)+1
    --这儿存在两种情况:1、字符串不存在分隔符号 2、字符串中存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔符号。

    return substring(@str,@start,@location-@start)
    end
    调用示例:select dbo.Get_StrArrayStrOfIndex('8,9,4',',',2)
    返回值:9

    三、结合上边两个函数,象数组一样遍历字符串中的元素

    declare @str varchar(50)
    set @str='1,2,3,4,5'
    declare @next int
    set @next=1
    while @next<=dbo.Get_StrArrayLength(@str,',')
    begin
    print dbo.Get_StrArrayStrOfIndex(@str,',',@next)
    set @next=@next+1
    end

    调用结果:
    1
    2
    3
    4
    5

    转自:http://bbs.csdn.net/topics/290052887

    SQL 如何去除重复的字符串

    --直接点的
    declare @str varchar(8000)
    declare @ret varchar(8000),@return varchar(8000)

    select @str = 'APR-11,APR12,APR06,APR-11,APR12,APR06'

    select @str = @str+','

    while charindex(',',@str) > 0
    begin
    select @ret = substring(@str,1,charindex(',',@str)-1)

    select @return = isnull(@return+',','')+@ret

    select @str = replace(@str,@ret+',','')
    end

    select @return
    ---------------------------
    APR-11,APR12,APR06

     摘自:http://bbs.csdn.net/topics/330130725

  • 相关阅读:
    数学+高精度 ZOJ 2313 Chinese Girls' Amusement
    最短路(Bellman_Ford) POJ 1860 Currency Exchange
    贪心 Gym 100502E Opening Ceremony
    概率 Gym 100502D Dice Game
    判断 Gym 100502K Train Passengers
    BFS POJ 3278 Catch That Cow
    DFS POJ 2362 Square
    DFS ZOJ 1002/HDOJ 1045 Fire Net
    组合数学(全排列)+DFS CSU 1563 Lexicography
    stack UVA 442 Matrix Chain Multiplication
  • 原文地址:https://www.cnblogs.com/HeroTan/p/4817288.html
Copyright © 2011-2022 走看看