从SQL-2008中的字符串中获取指定字符内的所有子字符串

时间:2014-05-15 12:01:49

标签: sql-server sql-server-2008

是否可以在不使用循环或最佳方式的情况下获取特定字符,'#image'和'#'中的所有子字符串

declare @str nvarchar(max)='get all substrings #image:header# #image:footer#'

预期结果

  

图像

     
     

     

页脚

2 个答案:

答案 0 :(得分:1)

get all substrings #image:header# #image:footer#

#image:替换为起始标记<X>

get all substrings <X>header# <X>footer#

#替换为结束标记</X>

get all substrings <X>header</X> <X>footer</X>

转换为XML并在X上粉碎。

declare @str nvarchar(max)='get all substrings #image:header# #image:footer#'

select T2.X.value('text()[1]', 'nvarchar(20)') as [image]
from (select cast(replace(replace((select @str for xml path('')), '#image:', '<X>'), '#', '</X>') as xml).query('.')) as T1(X)
  cross apply T1.X.nodes('X') as T2(X)

结果:

image
--------------------
header
footer

答案 1 :(得分:0)

我从here获得了解决方案 通过递归使用CTE去除字符串

declare @str nvarchar(100)='get all substrings #image:header# #image:footer# between specific characters'
declare @imageTokenStart nvarchar(8)='#image:'
declare @imageTokenEnd nvarchar(1)='#'

;WITH cte(msg,token)
as
(
    SELECT RIGHT(msg,(LEN(msg)- CHARINDEX(@imageTokenEnd, msg, CHARINDEX(@imageTokenStart, msg, 0) + 1)))
        ,SUBSTRING(msg, CHARINDEX(@imageTokenStart, msg, 0) + LEN(@imageTokenStart)
                , CHARINDEX(@imageTokenEnd, msg, CHARINDEX(@imageTokenStart, msg, 0) + 1) - (
                    CHARINDEX(@imageTokenStart, msg, 0) + LEN(@imageTokenStart)))
    FROM (SELECT @str as msg) tmp   
    WHERE CHARINDEX(@imageTokenStart,msg,0)>0

    UNION ALL

    SELECT RIGHT(msg,(LEN(msg)- CHARINDEX(@imageTokenEnd,msg,CHARINDEX(@imageTokenStart, msg, 0) + 1)))
        ,SUBSTRING(msg, CHARINDEX(@imageTokenStart, msg, 0) + LEN(@imageTokenStart)
                    , CHARINDEX(@imageTokenEnd, msg, 
                        CHARINDEX(@imageTokenStart, msg, 0) + 1) - (CHARINDEX(@imageTokenStart, msg, 0) + LEN(@imageTokenStart)))
    FROM cte
    WHERE CHARINDEX(@imageTokenStart,msg,0)>0
)

SELECT token FROM cte

结果

  

     

页脚