维护记录
港389 油压上限值 16.00修改为: 3.00 | 李雷  
港65 油压上限值 16.00修改为: 3.00
港356 油压上限值 16.00修改为: 3.00 | 李雷 红香
港356 油压上限值 16.00修改为: 3.00 | 范红 红香
港356 油压下限值 1.00修改为: 0.00 | 李雷 李伟现在想实现的结果是维护记录 维护人 审核人
港356 油压上限值 16.00修改为: 3.00 李雷 红香
港356 油压上限值 16.00修改为: 3.00 范红 红香
港356 油压下限值 1.00修改为: 0.00 李雷 李伟维护记录是一个字段想实现变成三个字段 ,有的记录里面有竖杠杠有 的没有竖杠杠,只要有竖杠杠的后面就有维护人,单不一定有审核人,维护人和审核人之间有好几个空格分开
请问大家这个怎样给它实现查询完后出来三个字段

解决方案 »

  1.   

    create FUNCTION f_splitSTR(
    @s   varchar(8000),   --待分拆的字符串
    @split varchar(10)     --数据分隔符
    )RETURNS @re TABLE(row tinyint,col varchar(100))
    AS
    BEGIN
        DECLARE @splitlen int,
    @Row tinyint
    set @row = 1
        SET @splitlen=LEN(@split+'a')-2
        WHILE CHARINDEX(@split,@s)>0
        BEGIN
    if (len(replace( LEFT(@s,CHARINDEX(@split,@s)-1),' ',''))>=1)
    begin

    INSERT @re VALUES(@row,LEFT(@s,CHARINDEX(@split,@s)-1))
    set @Row = @row + 1
    end
            SET @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,'')
        END
        if (len(replace(@s,' ',''))>=1)
    begin
    INSERT @re VALUES(@row,@s)
    end
        RETURN
    END
    GO
    declare @t table (
    r nvarchar(64))insert into @t 
    select '港389 油压上限值 16.00修改为: 3.00 | 李雷' union all
    select '港65 油压上限值 16.00修改为: 3.00' union all
    select '港356 油压上限值 16.00修改为: 3.00 | 李雷 红香' union all
    select '港356 油压上限值 16.00修改为: 3.00 | 范红 红香' union all
    select '港356 油压下限值 1.00修改为: 0.00 | 李雷 李伟' select case when charindex('|',r)>= 1 then left(r, charindex('|',r)-1)
       else r end as [维护记录],
       (select col from dbo.f_splitSTR(case when charindex('|',r)>= 1 then right(r, len(r)-charindex('|',r))
       else null end ,' ') where row = 1 ) as [维护人],
    (select col from dbo.f_splitSTR(case when charindex('|',r)>= 1 then right(r, len(r)-charindex('|',r))
       else null end ,' ') where row = 2 ) as [审核人]from @t a /*
    (5 行受影响)
    维护记录                                                             维护人                                                                                                  审核人
    ---------------------------------------------------------------- ---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
    港389 油压上限值 16.00修改为: 3.00                                        李雷                                                                                                   NULL
    港65 油压上限值 16.00修改为: 3.00                                         NULL                                                                                                 NULL
    港356 油压上限值 16.00修改为: 3.00                                        李雷                                                                                                   红香
    港356 油压上限值 16.00修改为: 3.00                                        范红                                                                                                   红香
    港356 油压下限值 1.00修改为: 0.00                                         李雷                                                                                                   李伟(5 行受影响)
    */
      

  2.   


    create table xi
    (维护记录 varchar(500))insert into xi
    select '港389 油压上限值 16.00修改为: 3.00 | 李雷' union all
    select '港65 油压上限值 16.00修改为: 3.00' union all
    select '港356 油压上限值 16.00修改为: 3.00 | 李雷 红香' union all
    select '港356 油压上限值 16.00修改为: 3.00 | 范红 红香' union all
    select '港356 油压下限值 1.00修改为: 0.00 | 李雷 李伟'
    with c1 as
    (select 维护记录,
            rtrim(substring(维护记录,1,
            case charindex(' | ',维护记录) when 0 then 200 else charindex(' | ',维护记录) end)) 'whjl'
     from xi
    ),
    c2 as
    (select whjl,
           isnull(substring(维护记录,len(whjl)+1,200),'') 'whsh'
     from c1
    )
    select whjl '维护记录',
           substring(whsh,3,charindex(' ',whsh,3)) '维护人',
           substring(whsh,case charindex(' ',whsh,4) when 0 then 200 else charindex(' ',whsh,4) end,200) '审核人'
    from c2/*
    维护记录                            维护人        审核人
    ----------------------------- ---------- ----------
    港389 油压上限值 16.00修改为:      李雷        
    港65 油压上限值 16.00修改为:                      
    港356 油压上限值 16.00修改为:      李雷         红香
    港356 油压上限值 16.00修改为:      范红         红香
    港356 油压下限值 1.00修改为:       李雷         李伟(5 row(s) affected)
    */
      

  3.   


    create table xi
    (维护记录 varchar(500))insert into xi
    select '港389 油压上限值 16.00修改为: 3.00 | 李雷' union all
    select '港65 油压上限值 16.00修改为: 3.00' union all
    select '港356 油压上限值 16.00修改为: 3.00 | 李雷 红香' union all
    select '港356 油压上限值 16.00修改为: 3.00 | 范红 红香' union all
    select '港356 油压下限值 1.00修改为: 0.00 | 李雷 李伟'
    with c1 as
    (select 维护记录,
            rtrim(substring(维护记录,1,
            case charindex(' | ',维护记录) when 0 then 200 else charindex(' | ',维护记录) end)) 'whjl'
     from xi
    ),
    c2 as
    (select whjl,
           isnull(substring(维护记录,len(whjl)+1,200),'') 'whsh'
     from c1
    )
    select whjl '维护记录',
           substring(whsh,3,charindex(' ',whsh,3)) '维护人',
           substring(whsh,case charindex(' ',whsh,4) when 0 then 200 else charindex(' ',whsh,4) end,200) '审核人'
    from c2/*
    维护记录                                                   维护人     审核人
    -------------------------------------------------- -------- --------
    港389 油压上限值 16.00修改为: 3.00                      李雷      
    港65 油压上限值 16.00修改为: 3.00                                    
    港356 油压上限值 16.00修改为: 3.00                      李雷       红香
    港356 油压上限值 16.00修改为: 3.00                      范红       红香
    港356 油压下限值 1.00修改为: 0.00                       李雷       李伟(5 row(s) affected)
    */
      

  4.   


    我这边的sql运行后报错了,提示不能使用‘该服务器版本中无法使用“通用表表达式”支持’
    还有什么别的方法吗?
      

  5.   

    是的,我就想用一条select语句实现,这条语句我要用到delphi程序里
      

  6.   

    --准备测试数据
    create table a_R(WR nvarchar(100))
    insert into a_R
    values('港389 油压上限值 16.00修改为: 3.00 | 李雷  ')
    insert into a_R
    values('港65 油压上限值 16.00修改为: 3.00')
    insert into a_R
    values('港356 油压上限值 16.00修改为: 3.00 | 李雷 红香')
    insert into a_R
    values('港356 油压上限值 16.00修改为: 3.00 | 范红 红香')
    insert into a_R
    values('港356 油压下限值 1.00修改为: 0.00 | 李雷 李伟')--实现你要的查询结果
    select WR, (case when WR like '% | %' then Left(WR,Charindex(' | ',WR,1)-1) else WR end) as [维护记录], 
    (case when WR like '% | %' then (case when Substring(WR, Charindex(' | ',WR,1)+3, Len(WR)-Charindex(' | ',WR,1)-2) like '% %' then Substring(WR,Charindex(' | ',WR,1)+3,Charindex(' ',Substring(WR,Charindex(' | ',WR,1)+3,Len(WR)-Charindex(' | ',WR,1)-2),1)-1) else Substring(WR, Charindex(' | ',WR,1)+3, Len(WR)-Charindex(' | ',WR,1)-2) end) else '' end) as [维护人],
    (case when WR like '% | %' then (case when Substring(WR, Charindex(' | ',WR,1)+3, Len(WR)-Charindex(' | ',WR,1)-2) like '% %' then Substring(WR,Charindex(' | ',WR,1)+2+Charindex(' ',Substring(WR,Charindex(' | ',WR,1)+3,Len(WR)-Charindex(' | ',WR,1)-2),1),LEN(WR)-Charindex(' | ',WR,1)-1-Charindex(' ',Substring(WR,Charindex(' | ',WR,1)+3,Len(WR)-Charindex(' | ',WR,1)-2),1)) else '' end) else '' end) as [审核人]
    from a_R
      

  7.   

    SQL2000,一条select语句实现.create table xi
    (维护记录 varchar(500))insert into xi
    select '港389 油压上限值 16.00修改为: 3.00 | 李雷' union all
    select '港65 油压上限值 16.00修改为: 3.00' union all
    select '港356 油压上限值 16.00修改为: 3.00 | 李雷 红香' union all
    select '港356 油压上限值 16.00修改为: 3.00 | 范红 红香' union all
    select '港356 油压下限值 1.00修改为: 0.00 | 李雷 李伟'
    select rtrim(substring(维护记录,1,case charindex(' | ',维护记录) when 0 then 200 else charindex(' | ',维护记录) end)) '维护记录',
           substring(isnull(substring(维护记录,len(rtrim(substring(维护记录,1,case charindex(' | ',维护记录) when 0 then 200 else charindex(' | ',维护记录) end)))+1,200),''),3,charindex(' ',isnull(substring(维护记录,len(rtrim(substring(维护记录,1,case charindex(' | ',维护记录) when 0 then 200 else charindex(' | ',维护记录) end)))+1,200),''),3)) '维护人',
           substring(isnull(substring(维护记录,len(rtrim(substring(维护记录,1,case charindex(' | ',维护记录) when 0 then 200 else charindex(' | ',维护记录) end)))+1,200),''),case charindex(' ',isnull(substring(维护记录,len(rtrim(substring(维护记录,1,case charindex(' | ',维护记录) when 0 then 200 else charindex(' | ',维护记录) end)))+1,200),''),4) when 0 then 200 else charindex(' ',isnull(substring(维护记录,len(rtrim(substring(维护记录,1,case charindex(' | ',维护记录) when 0 then 200 else charindex(' | ',维护记录) end)))+1,200),''),4) end,200) '审核人'
    from xi/*
    维护记录                                                   维护人     审核人
    -------------------------------------------------- -------- --------
    港389 油压上限值 16.00修改为: 3.00                      李雷      
    港65 油压上限值 16.00修改为: 3.00                                    
    港356 油压上限值 16.00修改为: 3.00                      李雷       红香
    港356 油压上限值 16.00修改为: 3.00                      范红       红香
    港356 油压下限值 1.00修改为: 0.00                       李雷       李伟(5 row(s) affected)
    */