当前位置: 代码迷 >> Sql Server >> 大伙儿帮帮忙,看着能不能实现感觉比较难的sql语句
  详细解决方案

大伙儿帮帮忙,看着能不能实现感觉比较难的sql语句

热度:39   发布时间:2016-04-27 11:52:28.0
大家帮帮忙,看着能不能实现感觉比较难的sql语句


维护记录
港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 李雷 李伟

维护记录是一个字段想实现变成三个字段 ,有的记录里面有竖杠杠有 的没有竖杠杠,只要有竖杠杠的后面就有维护人,单不一定有审核人,维护人和审核人之间有好几个空格分开
请问大家这个怎样给它实现查询完后出来三个字段

------解决方案--------------------
前两条记录 根据什么条件 被排除了?
------解决方案--------------------
SQL code
create FUNCTION f_splitSTR(@s   varchar(8000),   --待分拆的字符串@split varchar(10)     --数据分隔符)RETURNS @re TABLE(row tinyint,col varchar(100))ASBEGIN    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)[email protected],'')    END    if (len(replace(@s,' ',''))>=1)    begin        INSERT @re VALUES(@row,@s)    end    RETURNENDGOdeclare @t table (r    nvarchar(64))insert into @t select '港389 油压上限值 16.00修改为: 3.00 | 李雷' union allselect '港65 油压上限值 16.00修改为: 3.00' union allselect '港356 油压上限值 16.00修改为: 3.00 | 李雷 红香' union allselect '港356 油压上限值 16.00修改为: 3.00 | 范红 红香' union allselect '港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 行受影响)*/
------解决方案--------------------
--准备测试数据
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 [维护记录], 
  相关解决方案