表每个字段的内容如下a, b, c, d, 1|2|3|4, e
我希望查询出下面的形式, 就是有一个字段的内容里固定会出现3个|符号,能不能在SQL里按|截取出来分别显示在不同的字段里,|分割的内容里长度是不固定的所以不能按字符截取查询出的效果: a,b,c,d,1,2,3,4,e

解决方案 »

  1.   

    declare @var varchar(30)
    set @var='a, b, c, d, 1|2|3|4, e'
    select replace(@var,'|',',')
    --------------------------
    a, b, c, d, 1,2,3,4, e(1 行受影响)
      

  2.   

    declare @var varchar(30)
    set @var='a, b, c, d, 1|2|3|4, e'
    select replace(replace(@var,'|',','),' ','')
    -------------------
    a,b,c,d,1,2,3,4,e(1 行受影响)
      

  3.   

    【小小问题集锦4--拆分一个字符串的方法】 收藏 
    /*****拆分一个字符串*********问题描述:@str='fds,bbbf,eee,ddd,fff,hhhfg,dddde'  拆分成col------------------------fdsbbbfeeedddfffhhhfgdddde*/---方法:动态declare  @str  varchar(500),@aaa varchar(8000)set  @str='fds,bbbf,eee,ddd,fff,hhhfg,dddde'  set @aaa='select * from (select '''+REPLACE(@str,',',''' as str union all select ''')+''') a 'exec(@aaa)  go--方法:循环create  table  #t(  id  varchar(10))  declare  @str  varchar(300)  set  @str='fds,bbbf,eee,ddd,fff,hhhfg,dddde'  declare  @i  int  declare  @len  int  set  @i  =  1  while  @i  <  len(@str+',')  begin     insert  #t  select  substring(@str+',',@i,charindex(',',@str+',',@i)-@i)     set  @i  =  charindex(',',@str+',',@i)+1  end  select * from #tdrop table #tgo--orCREATE FUNCTION f_splitSTR(@s   varchar(8000),   --待分拆的字符串@split varchar(10)     --数据分隔符)RETURNS @re TABLE(col varchar(100))ASBEGINDECLARE @splitlen intSET @splitlen=LEN(@split+'a')-2WHILE CHARINDEX(@split,@s)>0BEGININSERT @re VALUES(LEFT(@s,CHARINDEX(@split,@s)-1))SET @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,'')ENDINSERT @re VALUES(@s)RETURNENDGO--方法:使用临时性分拆辅助表法CREATE FUNCTION f_splitSTR(@s   varchar(8000),  --待分拆的字符串@split varchar(10)     --数据分隔符)RETURNS @re TABLE(col varchar(100))ASBEGIN--创建分拆处理的辅助表(用户定义函数中只能操作表变量)DECLARE @t TABLE(ID int IDENTITY,b bit)INSERT @t(b) SELECT TOP 8000 0 FROM syscolumns a,syscolumns b
    INSERT @re SELECT SUBSTRING(@s,ID,CHARINDEX(@split,@s+@split,ID)-ID)FROM @tWHERE ID<=LEN(@s+'a') AND CHARINDEX(@split,@split+@s,ID)=IDRETURNENDGOdeclare  @str  varchar(500),@aaa varchar(8000)set  @str='fds,bbbf,eee,ddd,fff,hhhfg,dddde'  select * from dbo.f_splitSTR(@str,',')本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/feixianxxx/archive/2010/01/27/5263341.aspx
      

  4.   

    IF OBJECT_ID('[dbo].[f_GetStr]')>0
        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
    GOdeclare @Type nvarchar(30)
    set @Type = 'a, b, c, d, 1|2|3|4, e'SELECT [dbo].[f_GetStr](@Type,1,'|')a,[dbo].[f_GetStr](@Type,2,'|')b,
    [dbo].[f_GetStr](@Type,3,'|')c,[dbo].[f_GetStr](@Type,4,'|')d
    /*
    a b c d
    a, b, c, d, 1 2 3 4, e
    */
      

  5.   

        select a,b,c,d
        ,x1=convert(xml,'<root><row>'+replace(x,'|','</row><row>')+'</row></root>').value('(root/row)[1]','nvarchar(10)')
        ,x2=convert(xml,'<root><row>'+replace(x,'|','</row><row>')+'</row></root>').value('(root/row)[2]','nvarchar(10)')
        ,x3=convert(xml,'<root><row>'+replace(x,'|','</row><row>')+'</row></root>').value('(root/row)[3]','nvarchar(10)')
        ,x4=convert(xml,'<root><row>'+replace(x,'|','</row><row>')+'</row></root>').value('(root/row)[4]','nvarchar(10)')
        ,e
        from #test
        
        a          b          c          d          x1         x2         x3         x4         e
    ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
    a          b          c          d          1          2          3          4          e (1 行受影响)这样。。
      

  6.   


    CREATE TABLE A
    (
     [STR] NVARCHAR(100)
    )
    INSERT INTO A ([STR])
    SELECT 'A, B, C, D, 1|2|3|4, E' UNION ALL
    SELECT 'AA,BB,CC,DD, 11|22|33|44, E' 
    --
    SELECT REPLACE([STR],'|',', ') AS REPLACE_STR FROM A
      

  7.   

    由于大家理解不一样我再次表达一次   a, b, c, d, 1|2|3|4, e
    表的各字段内容 ,有一个字段内容特许会有3个|符号分割
     
    字段1 字段2  字段3  字段4   字段5      字段6
    a      b     c      d    1|2|3|4      e
    查询后的效果
    字段1 字段2  字段3  字段4   字段5  字段6  字段7  字段8  字段9 
    a      b     c      d      1      2      3     4      e
      

  8.   

    表的各字段内容 ,有一个字段内容特许会有3个|符号分割
     
    字段1 字段2 字段3 字段4     字段5   字段6
    a       b     c     d    1|2|3|4   e
    查询后的效果
    字段1  字段2  字段3  字段4  字段5  字段6 字段7 字段8 字段9  
     a       b     c     d    1      2     3     4     e
      

  9.   


    表的各字段内容 ,有一个字段内容特许会有3个|符号分割
     
    字段1 字段2 字段3 字段4     字段5   字段6
    a       b     c     d    1|2|3|4   e
    查询后的效果
    字段1  字段2  字段3  字段4  字段5  字段6 字段7 字段8 字段9  
     a       b     c     d    1      2     3     4     e
      

  10.   

    或者create table #test(a varchar(10),b varchar(10),c varchar(10),d varchar(10),x varchar(11),e varchar(10))
    insert #test
    select 'a','b','c','d','1|2|3|4','e' 
    select
     a, b, c, d,
     x1 = PARSENAME(REPLACE(x,'|','.'),4),   
     x2 = PARSENAME(REPLACE(x,'|','.'),3),
     x3 = PARSENAME(REPLACE(x,'|','.'),2),
     x4 = PARSENAME(REPLACE(x,'|','.'),1),
     e 
    from
      #test
    a          b          c          d          x1 x2 x3 x4 e
    ---------- ---------- ---------- ---------- --- --- -- --- ---
    a          b          c          d          1 2 3 4 e(1 行受影响)
      

  11.   

    如果 没用sqlserver2005的话,就看 这个
    if object_id('[tb]') is not null drop table [tb]
    go 
    create table [tb]([字段1] varchar(1),[字段2] varchar(1),[字段3] varchar(1),[字段4] varchar(1),[字段5] varchar(11),[字段6] varchar(1))
    insert [tb]
    select 'a','b','c','d','aaa|bb|cc|d','e' union all
    select 'a','b','c','d','aaa|bb|cc|d','e' union all
    select 'a','b','c','d','aaa|bb|cc|d','e' union all
    select 'a','b','c','d','aaa|bb|cc|d','e' union all
    select 'a','b','c','d','aaa|bb|cc|d','e'
    --1 加个序号,避免重复
    select id=identity(int,1,1),* into #t from tb
    --2 分解字段5
    Select
        a.id,a.字段1,a.字段2,a.字段3,a.字段4,
        字段5=substring(a.字段5,b.number,charindex('|',a.字段5+'|',b.number)-b.number) ,a.字段6,
        b.number
    into #t1
    from 
        #t a join master..spt_values  b 
        ON B.type='p' AND B.number BETWEEN 1 AND LEN(A.字段5)
    where
         substring('|'+a.字段5,b.number,1)='|'--3 加小组内的序号,避免重复
    select *,id1=(select count(1) from #t1 where id=t.id and number<=t.number)
    into #t2
    from #t1 t--4 合并显示
    declare @sql varchar(8000)
    set @sql = 'select 字段1,字段2,字段3,字段4 '
    select @sql = @sql + ' , max(case id1 when ' + ltrim(id1) + ' then 字段5 else null end) [字段' +ltrim(id1+4) + ']'
    from (select distinct id1 from #t2) as a
    set @sql = @sql + ',字段6 as 字段'+(select ltrim(count(distinct id1)+5) from #t2)+' from #t2 group by id,字段1,字段2,字段3,字段4,字段6'
    exec(@sql)--结果
    /*
    字段1  字段2  字段3  字段4  字段5         字段6         字段7         字段8         字段9  
    ---- ---- ---- ---- ----------- ----------- ----------- ----------- ---- 
    a    b    c    d    aaa         bb          cc          d           e
    a    b    c    d    aaa         bb          cc          d           e
    a    b    c    d    aaa         bb          cc          d           e
    a    b    c    d    aaa         bb          cc          d           e
    a    b    c    d    aaa         bb          cc          d           e(所影响的行数为 5 行)警告: 聚合或其他 SET 操作消除了空值。
    */