【问题标题】:Searching through XML in T-SQL with conditions使用条件在 T-SQL 中搜索 XML
【发布时间】:2020-05-06 14:09:53
【问题描述】:

我正在尝试根据条件将 XML 数据类型中的正确信息转换为常规标量变量,但是我无法获取正确的信息。

这是我正在搜索的 XML:

<Loop2420>
                <NM1>
                  <F98_1>PW</F98_1>
                  <F1065>2</F1065>
                </NM1>
                <N3>
                  <F166>81715 DOCTOR CARRE</F166>
                </N3>
                <N4>
                  <F19>INDIO</F19>
                  <F156>CA</F156>
                  <F116>92201</F116>
                </N4>
              </Loop2420>
              <Loop2420>
                <NM1>
                  <F98_1>45</F98_1>
                  <F1065>2</F1065>
                </NM1>
                <N3>
                  <F166>51250 MECCA AVE</F166>
                </N3>
                <N4>
                  <F19>COACHELLA</F19>
                  <F156>CA</F156>
                  <F116>92236</F116>
                </N4>
              </Loop2420>

基本上我需要从 获取数字,但前提是 等于 'PW'。

我试过了:

declare @zip varchar(30)
select @zip = T.value('(F116)[1]','varchar(30)')
        from @TransactionXML.nodes('/Loop2420/N4') Trans(T)
        where T.value('(/Loop2420/NM1/F98_1)[1]','varchar(30)') = 'PW'

但这有时会返回 的值,即使 等于 '45'。

有什么建议吗?谢谢。

【问题讨论】:

    标签: sql xml tsql ssms


    【解决方案1】:

    将测试放入 XQuery 本身并将其固定到您正在检查的节点:

    SELECT @zip = T.value('(N4/F116)[1]', 'varchar(30)')
    FROM @TransactionXML.nodes('/Loop2420') Trans(T)
    WHERE T.exist('NM1/F98_1[text()="PW"]') = 1
    

    如果PW 不是静态值,请使用sql:variable()sql:column() 函数将其合并到查询中。

    【讨论】:

    • @H22 然后您需要修改问题以显示您想要的实际结果和/或失败的输入。 This query gives 92201,根据您的输入,我希望它是正确的。请注意,如果有多个匹配节点,则无论如何结果都将是不确定的——如果不需要,您需要按某种顺序排列。
    • @H22 那么您的实际查询可能看起来也与我的不同。但请注意不要无意中在错误的节点上测试是否存在(我们要检查是否存在与从 N4/F116 获取的值处于同一级别的 NM1/F98_1 节点)。
    猜你喜欢
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    相关资源
    最近更新 更多