一个表有一个字段为如下形式:
name
qqq_bbb_cccc_eee如何在SQL里把bbb取出来啊。

解决方案 »

  1.   

    SUBSTRING
    语法
    SUBSTRING ( expression , start , length )
      

  2.   

    --如果位置固定
    select substring(name,5,3) from tb
    --如果位置不固定
    select substring(name , charindex('-',name)+1 , charindex('-',name,charindex('-',name)+1) - charindex('-',name) -1) from tb
      

  3.   

    declare @name as varchar(20)
    set @name = 'qqq_bbb_cccc_eee'select 位置固定 = substring(@name , 5 ,3) select 位置不固定 = substring(@name , charindex('_',@name)+1 , charindex('_',@name,charindex('_',@name)+1) - charindex('_',@name) -1)/*
    位置固定   
    ------ 
    bbb(所影响的行数为 1 行)位置不固定                
    -------------------- 
    bbb(所影响的行数为 1 行)
    */
      

  4.   

    create table #t(name varchar(50)) 
    insert #t select 'qqq_bbb_cccc_eee'
    -----------------------------------
    select parsename(replace(name,'_','.'),3) from #t
      

  5.   

    name 
    qqq_bbb_cccc_eee 如何在SQL里把bbb取出来啊。--------------------------有问题呢?
    到底你是什么意思,如果只是bbb取出来
    那你直接SELECT 'bbb'不就得了,问题有歧义。
      

  6.   


    位置不固定
    declare @str1 nvarchar(100),@str2 nvarchar(100)
    set @str1 = 'ddddddqq_bbdddqq_cccc_eee' 
    set @str2=stuff(@str1,charindex('_',@str1,1),1,'m')
    select substring(@str1,charindex('_',@str1,1)+1,charindex('_',@str2,1)-charindex('_',@str1,1)-1)
      

  7.   

    我想说的是 ;
    这个字段的值是有下划线分割的字符,位置也是不固定的。
    name
    qqq_bbdddaaab_cccc_eee 
    qqq_bbaaab_cccc
    qqq_bdddbb
     我现在需要在查询取出第二部分的字符即:
    select substring(name , charindex('_',name)+1 , charindex('_',name,charindex('_',@name)+1) - charindex('_',name) -1)
    但是这样,如果字段只有两部分如:qqq_bdddbb就会出错。
      

  8.   

    select reverse(parsename(replace(reverse(name),'_','.'),2)) from #t
      

  9.   

    侄name值莨
    name
    dfsdfds_dddfa_fsdfa_dsfasd
    sdfsdaf_fdsfg_fds_fsdafs
    dafasdf_fasdf_fdsfsd
    sdfds_dsfasd要诓询时训诙值值取前娌恐和烘部侄要

    dddfa
    fdsfg
    fasdf
    dsfasd楼 ;
    select substring(name , charindex('_',name)+1 , charindex('_',name,charindex('_',name)+1) - charindex('_',name) -1)
     from b
    械sdfds_dsfasd时
    Invalid length parameter passed to the substring function.
      

  10.   

    字段name得值有以下数据构成
    dfsdfds_dddfa_fsdfa_dsfasd
    sdfsdaf_fdsfg_fds_fsdafs
    dafasdf_fasdf_fdsfsd
    sdfds_dsfasd需要在查询数据时把第二部分得值取出来,

    dddfa
    fdsfg
    fasdf
    dsfasd楼上:
    select substring(name , charindex('_',name)+1 , charindex('_',name,charindex('_',name)+1) - charindex('_',name) -1)
     from b
    运行到sdfds_dsfasd时出错
    Invalid length parameter passed to the substring function.
      

  11.   

    to:10楼wgzaaa 
    得到的全是null值
      

  12.   

    select name=
    (case when 
    charindex('_',right(name,len(name)-charindex('_',name)))>0 
    then 
    substring(name,charindex('_',name)+1,(charindex('_',name,charindex('_',name)+1)
    -(charindex('_',name)+1)))
    else
    right(name,len(name)-charindex('_',name))
    end
    )
    from
    (
    select 'aaa_kkk_as' as name
    union all
    select 'aaa_222'
    ) t太复杂了 -. -
    自己都不忍心看 等高人
      

  13.   

    select name=
    (case when 
    charindex('_',right(name,len(name)-charindex('_',name)))>0 
    then 
    substring(name,charindex('_',name)+1,(charindex('_',name,charindex('_',name)+1)
    -(charindex('_',name)+1)))
    else
    right(name,len(name)-charindex('_',name))
    end
    )
    from
    (
    select 'aaa_kkk_as' as name
    union all
    select 'aaa_222'
    ) t太复杂了 -. -
    自己都不忍心看 等高人
      

  14.   

    select name=
    (case when 
    charindex('_',right(name,len(name)-charindex('_',name)))>0 
    then 
    substring(name,charindex('_',name)+1,(charindex('_',name,charindex('_',name)+1)
    -(charindex('_',name)+1)))
    else
    right(name,len(name)-charindex('_',name))
    end
    )
    from
    (
    select 'aaa_kkk_as' as name
    union all
    select 'aaa_222'
    ) t太复杂了 -. -
    自己都不忍心看 等高人
      

  15.   

    create table b (name varchar(50))
    insert b select 'dfsdfds_dddfa_fsdfa_dsfasd'  union all select 
    'sdfsdaf_fdsfg_fds_fsdafs' union all select 
    'dafasdf_fasdf_fdsfsd' union all select 
    'sdfds_dsfasd' 
    select substring(name , charindex( '_',name+'_')+1 , charindex( '_',name+'_',charindex( '_',name+'_')+1) - charindex( '_',name+'_') -1) from b 
      

  16.   

    结果:dddfa 
    fdsfg 
    fasdf 
    dsfasd 
      

  17.   

    如果字段只有两部分如:qqq_bdddbb就会出错。这是因为两部分的时候没有'_',你的加 charindex(  '_ ',name+ '_ ',charindex(  '_ ',name+ '_ ')+1)
      

  18.   

    create function kkk(@text varchar(100))
    returns varchar(50)
    as
    begin
    declare @p varchar(50)
    declare @num int
    if(charindex('_',@text)>0)
    begin
    set @text=substring(@text,charindex('_',@text)+1,len(@text))
    set @num=charindex('_',@text)
    if(@num>0)set @p=substring(@text,1,charindex('_',@text)-1)
    else set @p=@text
    end
    return @p
    end调用
    select dbo.kkk('_bbb_asdf')
      

  19.   


    declare  @T table ([Name] varchar(300))
    insert @T select 'dfsdfds_dddfa_fsdfa_dsfasd' 
    insert @T select 'sdfsdaf_fdsfg_fds_fsdafs' 
    insert @T select 'dafasdf_fasdf_fdsfsd' 
    insert @T select 'sdfds_dsfasd' select case when len([Name])-len(REPLACE([Name],'_',''))>=2 then SUBSTRING([Name],charindex('_',[Name])+1,charindex('_',[Name],charindex('_',[Name])+1)-charindex('_',[Name])-1)
                when len([Name])-len(REPLACE([Name],'_',''))=1 then SUBSTRING([Name],charindex('_',[Name])+1,len([Name])-charindex('_',[Name])) end 
    from @T
      

  20.   

    --测试数据
    declare @Test table(Col varchar(300))
    insert @Test
    select '1_1' union all
    select '1.2_1.2_1.2' union all
    select '1.2.3_1.2.3_1.2.3_1.2.3'select Result=substring
    (
    Col+'_',
    charindex('_',Col)+1,
    charindex('_',Col+'_',charindex('_',Col)+1) - charindex('_',Col) - 1
    )
    from @Test
    /*
    Result
    1
    1.2
    1.2.3
    */--如果Col最多只有4部分(最多3个下划线):
    select Result=replace(reverse(parsename(replace(reverse(replace(Col,'.','!@#$%^&*()')),'_','.'),2)),'!@#$%^&*()','.') from @Test
    /*
    Result
    1
    1.2
    1.2.3
    */
      

  21.   


    declare @num int
    declare @str1 nvarchar(100),@str2 nvarchar(100)
    set @str1 = '_bbdddqqeee_' 
    set @str2=stuff(@str1,charindex('_',@str1,1),1,'m')
    if(charindex('_',@str2,1)>charindex('_',@str1,1))
       set @num=charindex('_',@str2,1)-charindex('_',@str1,1)-1
    else
       set @num=len(@str1)-charindex('_',@str1,1)
    select substring(@str1,charindex('_',@str1,1)+1,@num)
    /*
    ----------------------------------------------------------------------------
    bbdddqqeee*/
      

  22.   

    可以在字符的后面先加上个'_',这样应该就可以了
    declare @name as varchar(20)
    set @name = 'qqq_bbb_cccc_eee' + '_'select 位置固定 = substring(@name , 5 ,3) select 位置不固定 = substring(@name , charindex('_',@name)+1 , charindex('_',@name,charindex('_',@name)+1) - charindex('_',@name) -1)
      

  23.   


    declare @test table(id int ,sname varchar(50))
    insert into @test
    select 1,'qqq_bbb_cccc_eee'
    select top 8000 id=identity(int,1,1)
    into # from syscolumns
    select 
    id=identity(int,1,1),a.id as AID,
    sname=substring(a.sname,b.id,charindex('_',a.sname+'_',b.id)-b.id)
    into #result
    from  @test a,# b 
    where 
    substring('_'+a.sname,b.id,1)='_' and a.id=1
    select * from  #result where aid=1 and id=2drop table #,#result
      

  24.   

    我的适合于 asd_bbdddqqeee_asd ,_bbdddqqeee_asd, _bbdddqqeee_,  _bbdddqqeee