【问题标题】:T-SQL Extract portion of xml or nvarchar(max) column matching patternT-SQL 提取部分 xml 或 nvarchar(max) 列匹配模式
【发布时间】:2012-06-05 00:13:25
【问题描述】:

我想做一些我认为使用 T-SQL//SQL Server 2008 R2 相当简单的事情,但我似乎想不出办法。

如果我使用 Java、C#、C++ 等,我会这样做:

  1. 查找字符串中第一次出现“123”的位置
  2. 从该位置执行子字符串操作,获取接下来的 50 个字符

所以,在 SQL Server 中,我基本上喜欢:

  1. 查找列 (X) 包含所述字符串的所有行(基本上是 LIKE 子句)
  2. 从该列返回从所述字符串位置开始的 50 个字符。

我可以这样做吗? 我可以将一个 XML 列强制转换为 nvarchar(max),进行类似操作,并进行子字符串操作,但我不知道如何获取不过,列中的所述字符串排在首位。


评论中要求的示例内容

CREATE TABLE SampleTable(xmlData xml);

如果 SampleTable 的 xmlData 列如下所示,则假设该值为 1。出于调试目的,我想从有趣的 unicode Þ 字符中提取字符串向前 50 个字符(或者如果小于 50,则到文件末尾)。

<RootNode>
    <Row>
        <NestedNode1>
            some text.
        </NestedNode1>

        <NestedNode2>
            123456
        </NestedNode2>

        <NestedNode3>
            Þ Some crazy name with unicode letters. Þ
        </NestedNode3>
    </Row>
</RootNode>

【问题讨论】:

  • 你能举一个源数据和匹配模式的例子吗?由于这是 XML,因此可能有一些 XML 方法可以比转换为字符串和使用 CHARINDEX / PATINDEX 更正确地执行您需要的操作
  • 为什么 SUBSTRING(X,CHARINDEX('123',X),50) 不做你想做的事?
  • 当然,没问题。我用示例修改了上面的问题。
  • @GilM,也许是这样 - 将其发布为答案,如果 CHARINDEX 有效,我会成为一个快乐的人,你会得到积分 :)

标签: sql-server database tsql sql-server-2008-r2


【解决方案1】:

您在寻找 CHARINDEX 吗?

;WITH CTE AS(
    SELECT CAST (xmlData as nvarchar(max)) as X
    FROM SampleTable
)
SELECT SUBSTRING(X,CHARINDEX(N'Þ',X),50) as [String]
FROM CTE
WHERE CHARINDEX(N'Þ',X)>0

【讨论】:

  • 完美,谢谢。不知道我在谷歌搜索中是如何错过 charindex 的 :) 但我很高兴它就这么简单。
  • 没问题。开心就好。有些东西很难用谷歌搜索。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
相关资源
最近更新 更多