有一表字段为 A,字段A的内容如下: 
   A
1|2|3|4|5
1|2|3|4|5
1|2|3|4|5
1|2|3|4|5
1|2|3|4|5
1|2|3|4|5我只想取出数字2所在的位置的数据 请高手指点  谢谢!!

解决方案 »

  1.   

    结果是什么?
    |2|的位置?
    select charindex('|2|','|'+A+'|')
    from ta
      

  2.   

    --========+++++++++++++++++++++++++++++++++++==========
    --======= 每天都在进步,却依然追不上地球的自传=========
    --======= By: zc_0101 At:2010-07-23 16:04:36=========
    --========++++++++++++++++++++++++++++++++++++=========
    --> 测试数据: #A
    if object_id('tempdb.dbo.#A') is not null drop table #A
    create table #A (ID INT IDENTITY(1,1),COL VARCHAR(100))
    insert into #A
    select '1|2|3|4|5' union all
    select '1|2|3|4|5' union all
    select '1|2|3|4|5' union all
    select '1|2|3|4|5' union all
    select '1|2|3|4|5' union all
    select '1|2|3|4|5'select * from #A--创建自定义函数
    --SQL Server Split函数
    --Author:zc_0101 
    --说明:
    --支持分割符多字节
    --使用方法 
    --Select * FROM DBO.F_SQLSERVER_SPLIT('1203401230105045','0')    
    --select * from DBO.F_SQLSERVER_SPLIT('abc1234a12348991234','1234')    
     CREATE FUNCTION F_SQLSERVER_SPLIT(@Long_str varchar(8000),@split_str varchar(100))    
    RETURNS  @tmp TABLE(        
        ID          inT     IDENTITY PRIMARY KEY,      
        short_str   varchar(8000)    
    )    
    AS   
    BEGIN   
        DECLARE @long_str_Tmp varchar(8000),@short_str varchar(8000),@split_str_length int   
        SET @split_str_length = LEN(@split_str)    
        IF CHARINDEX(@split_str,@Long_str)=1 
             SET @long_str_Tmp=SUBSTRING(@Long_str,@split_str_length+1,LEN(@Long_str)-@split_str_length)
        ELSE
             SET @long_str_Tmp=@Long_str
        IF CHARINDEX(REVERSE(@split_str),REVERSE(@long_str_Tmp))>1    
            SET @long_str_Tmp=@long_str_Tmp+@split_str    
        ELSE   
            SET @long_str_Tmp=@long_str_Tmp    
    IF CHARINDEX(@split_str,@long_str_Tmp)=0
    Insert INTO @tmp select @long_str_Tmp 
    ELSE
    BEGIN
    WHILE CHARINDEX(@split_str,@long_str_Tmp)>0    
    BEGIN   
    SET @short_str=SUBSTRING(@long_str_Tmp,1,CHARINDEX(@split_str,@long_str_Tmp)-1)    
    DECLARE @long_str_Tmp_LEN INT,@split_str_Position_END int   
    SET @long_str_Tmp_LEN = LEN(@long_str_Tmp)    
    SET @split_str_Position_END = LEN(@short_str)+@split_str_length    
    SET @long_str_Tmp=REVERSE(SUBSTRING(REVERSE(@long_str_Tmp),1,@long_str_Tmp_LEN-@split_str_Position_END))
    IF @short_str<>'' Insert INTO @tmp select @short_str    
    END   
    END
        RETURN     
    END ----------------查询------------
    SELECT a.ID,b.SHORT_STR col FROM #A a 
    cross apply DBO.F_SQLSERVER_SPLIT(a.COL,'|')b WHERE b.ID=2
    ----------------结果--------------
    /*
    ID col
    1 2
    2 2
    3 2
    4 2
    5 2
    6 2
    */
      

  3.   

    declare @str varchar(max)
    set @str='1|2|3|4|5'
    --select  Charindex('|',@str,0)
    select  Substring(@str,2,1)看看是不是你想要的
      

  4.   


    那就 Substring 里面把参数换一下就可以了啊 ,用charindex 取到位置和长度 
      

  5.   


    if object_id('tempdb.dbo.#A') is not null drop table #A
    create table #A (ID INT IDENTITY(1,1),COL VARCHAR(100))
    insert into #A
    select '1|2|3|4|5' union all
    select '1|2|3|4|5' union all
    select '1|2|3|4|5' union all
    select '1|2|3|4|5' union all
    select '1|2|3|4|5' union all
    select '1|2|3|4|5' union all
    select '1|2222|33|4|5'
    select substring(substring(col,charindex('|',col,1)+1,len(col)),1,charindex('|',substring(col,charindex('|',col,1)+1,len(col)),1)-1) from #A结果
    无列名
    2
    2
    2
    2
    2
    2
    2222
      

  6.   

    你的这个问题用substring 和 charindex就可以解决了
      

  7.   

    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
    GO
      

  8.   


    declare @a varchar(8000),@b varchar(8000),@d int; set @a=
    '1|2|3|4|5
    1|2|3|4|5
    1|2|3|4|5
    1|2|3|4|5
    1|2|3|4|5
    1|2|3|4|5';set @d=len(@a);
    set @b='';
    select subString(@a,58,1);
    while @d>-1 
    begin
        if subString(@a,@d,1)='2' 
        begin
            set @b=@b+subString(@a,@d,1)+' ';
        end
        set @d=@d-1; 
    end
    select @b;