当前位置: 代码迷 >> Sql Server >> SQL 截取字符串解决方法
  详细解决方案

SQL 截取字符串解决方法

热度:32   发布时间:2016-04-24 10:01:31.0
SQL 截取字符串
<top:28.324;left:20.409;"><nobr>
 <span style="font-size:9.111;">Printed:</span>
 <span style="font-size:9.111;">09-Jul-2014</span>
 <span style="font-size:9.111;">19:59:17</span>
 </nobr></div>


在SQL里,这样的一串字符要怎么截取成
Printed:09-Jul-2014 19:59:17

注意里面有换行的
------解决方案--------------------
这个参考下,不是最好的实现方式
declare @s varchar(max)
set @s= '<top:28.324;left:20.409;"><nobr>
 <span style="font-size:9.111;">Printed:</span>
 <span style="font-size:9.111;">09-Jul-2014</span>
 <span style="font-size:9.111;">19:59:17</span>
 </nobr></div>'

;with cte as
(
select row_number () over ( order by snum desc )as rn1,snum  
from (
 select  distinct  charindex ('">',@s,number) as snum  from  master.dbo.spt_values   where type='p' and  number >=1 and number <len (@s) 
 )t
 )
 ,cte1 as
 (
 select row_number () over ( order by enum desc )as rn2,enum  
from (
 select  distinct charindex ('</span>',@s,number) as enum from  master.dbo.spt_values   where type='p' and  number >=1 and number <len (@s) 
 )t2
 )
 select   substring (@s,cte.snum +2,cte1.enum-cte.snum-2) from cte 
 inner join  cte1 on cte.rn1=cte1.rn2 where cte.snum<>0 and  cte1.enum<>0
 

--(无列名)
--19:59:17
--09-Jul-2014
--Printed:

------解决方案--------------------
-- 先得把 <nobr> .. </nobr> 这一段提取出来,然后用 xml 进行处理
DECLARE @text varchar(max)
DECLARE @i1 int
DECLARE @i2 int

SET @text = '<top:28.324;left:20.409;"><nobr>
 <span style="font-size:9.111;">Printed:</span>
 <span style="font-size:9.111;">09-Jul-2014</span>
 <span style="font-size:9.111;">19:59:17</span>
 </nobr></div>';
SET @i1 = CharIndex('<nobr>',@text,1)
SET @i2 = CharIndex('</nobr>',@text,1)

DECLARE @myDoc xml
SET @myDoc = SubString(@text,@i1,@i2-@i1+Len('</nobr>'))

SELECT T.c.value('.','varchar(20)') 
  FROM @myDoc.nodes('/nobr/span') T(c)
for xml path('')

XML_********-****-****-****-************
---------------------------
Printed:09-Jul-201419:59:17

------解决方案--------------------
引用:
Quote: 引用:

这个参考下,不是最好的实现方式
declare @s varchar(max)
set @s= '<top:28.324;left:20.409;"><nobr>
 <span style="font-size:9.111;">Printed:</span>
 <span style="font-size:9.111;">09-Jul-2014</span>
 <span style="font-size:9.111;">19:59:17</span>
 </nobr></div>'

;with cte as
(
select row_number () over ( order by snum desc )as rn1,snum  
from (
 select  distinct  charindex ('">',@s,number) as snum  from  master.dbo.spt_values   where type='p' and  number >=1 and number <len (@s) 
 )t
 )
 ,cte1 as
 (
 select row_number () over ( order by enum desc )as rn2,enum  
from (
 select  distinct charindex ('</span>',@s,number) as enum from  master.dbo.spt_values   where type='p' and  number >=1 and number <len (@s) 
 )t2
 )
 select   substring (@s,cte.snum +2,cte1.enum-cte.snum-2) from cte 
 inner join  cte1 on cte.rn1=cte1.rn2 where cte.snum<>0 and  cte1.enum<>0
 

--(无列名)
--19:59:17
--09-Jul-2014
--Printed:
能处理成Printed:09-Jul-2014 19:59:17吗


declare @s varchar(max)
set @s= '<top:28.324;left:20.409;"><nobr>
 <span style="font-size:9.111;">Printed:</span>
 <span style="font-size:9.111;">09-Jul-2014</span>
 <span style="font-size:9.111;">19:59:17</span>
 </nobr></div>'
 
;with cte as
(
select row_number () over ( order by snum desc )as rn1,snum  
  相关解决方案