查到很多自定义函数都是模拟split取出各个分段的,如|a|b|c|d|  的到  a b c d 四个我需要已知 b 要得到 它在|a|b|c|d| 第几个(第二个)请大侠帮忙,谢谢

解决方案 »

  1.   

    select charindex('b','|a|b|c|d|');
      

  2.   

    select substring('|a|b|c|d|',charindex('b','|a|b|c|d|'),1)
      

  3.   

    select charindex('b',replace('|a|b|c|d|','|',''))
      

  4.   

    charindex('|b|','|a|b|c|d|') 不对的吧,如果是|ac|b|c|d| 里那,用charindex|b|得到是4,可是我想得到的是 2 啊
      

  5.   

    select charindex('b',replace('|a|b|c|d|','|',''));
      

  6.   

    select charindex('b',replace('|a|b|c|d|','|',''));如果被查字串是|ab|abc|b|cbd|dds|acb|呢,不是不对了吗
      

  7.   

    --在uf_split函数里加自增列CREATE function uf_split
    (
    @str varchar(8000) --要分拆的字符串
    ,@spli varchar(10) --字符串分隔符
    )
    returns @retab table(id int identity(1,1),istr varchar(8000))
    as
    begin
    declare @i     int
    declare @splen int
    select @splen=len(@spli),@i=charindex(@spli,@str)
    while @i > 0
    begin
    insert into @retab 
    values(left(@str,@i-1))
    select @str=substring(@str,@i+@splen,8000)
    select @i=charindex(@spli,@str)
    end
    if @str<>'' insert into @retab values(@str)
    return
    endselect id from uf_split('ab|abc|b|cbd|dds|acb','|')
    where istr='b'
    /*
    id          
    ----------- 
    3(所影响的行数为 1 行)
    */
      

  8.   

    可能提问的时候把字串设简单了我需要知道 |cbd|  在  |ab|abc|b|cbd|dds|acb|  中第几位 (第4位)
      

  9.   

    gahade(与君共勉) 有没有直接可以用的函数,不用再按条件取出的?小弟比较菜……
      

  10.   

    把所有的|用stuff函数转换为''就可以了
      

  11.   

    我现在有两个字段
    A                    B
    |1|32|12|27|         |122|56.5|100|8|两个字段中的值是一一对应的,就是A的1对应B的122现在要查A中12对应的值大于50的所有记录是这么个情况,实在想不出来……郁闷
      

  12.   

    gahade(与君共勉)小弟实在不是很懂sql的函数,上面你给的函数能否改成我需要的,请指点,谢谢
      

  13.   

    declare @str varchar(800),@str1 varchar(100),@i int
    set @i=0
    set @str1='|cbd|'
    set @str='|ab|abc|b|cbd|dds|acb|'
    select @str=left(@str,charindex(@str1,@str))
    while charindex('|',@str)>0
    begin
    set @str=substring(@str,charindex('|',@str)+1,len(@str)-charindex('|',@str))
    set @i=@i+1
    end
    print @i
      

  14.   

    sdhylj(青锋-SS)这个写成函数怎么写?小弟不会,谢谢,谢谢,呵呵
      

  15.   

    CREATE FUNCTION dbo.f_1(@str varchar(8000),@str1 varchar(100))
    RETURNS int AS
    BEGIN 
    declare @i int
    set @i=0
    select @str=left(@str,charindex(@str1,@str))
    while charindex('|',@str)>0
    begin
    set @str=substring(@str,charindex('|',@str)+1,len(@str)-charindex('|',@str))
    set @i=@i+1
    end
    return @i
    END
      

  16.   

    邹老大的例子:
    --分段截取函数
    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
    GO
      

  17.   

    declare @str varchar(800),@str1 varchar(100)
    set @str1='|cbd|'
    set @str='|ab|abc|b|cbd|dds|acb|'
    print(dbo.f_1(@str,@str1))输出
    --------
    4
      

  18.   

    MS一句就可以了
    declare @str varchar(800),@str1 varchar(100)
    set @str1='|cbd|'
    set @str='|ab|abc|b|cbd|dds|acb|'select len(left(@str,charindex(@str1,@str)))-len( replace(left(@str,charindex(@str1,@str)),'|',''))-------------
    4
      

  19.   

    playwarcraft(时间就像乳沟,挤挤还是有的) 
    MS一句就可以了
    declare @str varchar(800),@str1 varchar(100)
    set @str1='|cbd|'
    set @str='|ab|abc|b|cbd|dds|acb|'select len(left(@str,charindex(@str1,@str)))-len( replace(left(@str,charindex(@str1,@str)),'|',''))-------------
    4正解!
      

  20.   

    declare @str varchar(800),@str1 varchar(100) ,@str_str1 varchar(20)set @str1='|cbd|'set @str='|ab|abc|bd|cbd|dds|acb|'set @str_str1 =left(@str,charindex(@str1,@str))select  len(@str_str1)-len( replace(@str_str1,'|',''))