【问题标题】:get all sub-strings within specified characters from a strings in SQL-2008从 SQL-2008 中的字符串中获取指定字符内的所有子字符串
【发布时间】:2014-05-15 12:01:48
【问题描述】:

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

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

预期结果

图片


标题

页脚

【问题讨论】:

  • 不确定,但认为可以使用xpath完成

标签: sql-server sql-server-2008


【解决方案1】:
get all substrings #image:header# #image:footer#

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

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

# 替换为结束标签&lt;/X&gt;

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

【讨论】:

  • 谢谢 Mikael,我使用了你的其他解决方案,CTE 和递归调用,我在这里找到了 link,它更适合我的情况
【解决方案2】:

我从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

结果

标题

页脚

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    相关资源
    最近更新 更多