json - 遍历 XML 节点,然后检查是否有匹配的 json 值,然后选择该值

标签 json sql-server xml t-sql xquery

显然我有一个字段调用Data,它在这些节点内存储一些 xml 节点+ json。

我可以使用以下方法检索deliveryID:

JSON_VALUE(ml.Data.value('(/row/value)[2]', 'NVARCHAR(MAX)'),'$.transactions[0].deliveryId') deliveryID 

但是,交易可能并不总是在它的第二个节点上, 它可以位于任何行。

是否有其他方法可以迭代该节点并查找它内部是否有 json 事务,然后从该行获取 DeliveryID?

谢谢

<row>
  <value id="1ae95d67-599e-4ab6-9ffd-08d4d90ab608" display-name="Cardholder_id" data-type="Int32">17</value>
  <value id="1ae95d67-599e-4ab6-9ffd-08d4d90ab608" display-name="Cardholder_id" data-type="Int32">17</value>
  <value id="eb71fd46-f0b2-401d-9775-08d4d90ab608" display-name="Card_Number">3083 2614 5022 21321</value>
  <value id="4fc261b2-f776-4fd4-8e1d-08d4d90ab608" display-name="Email_Address"><a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="670d020b0b08270609044904080a" rel="noreferrer noopener nofollow">[email protected]</a></value>
  <value id="c867d4e5-cc0b-4ee6-b911-08d6134132e0" display-name="BP_TRIGGERS_2.0">{"transactions":[{"BP_CommsRef":"V0001","BP_Offer_Expiry":"2018-10-01T00:00:00","deliveryId":"20320925","Job_Number":"A34F443","Send_Date":"2018-09-26T00:00:00"}]}</value>
</row>

最佳答案

如果我没理解错的话,你想找到 JSON在您的<value>内元素并阅读deliverId从那里:

Declare @XML xml = '
<row>
  <value id="1ae95d67-599e-4ab6-9ffd-08d4d90ab608" display-name="Cardholder_id" data-type="Int32">17</value>
  <value id="1ae95d67-599e-4ab6-9ffd-08d4d90ab608" display-name="Cardholder_id" data-type="Int32">17</value>
  <value id="eb71fd46-f0b2-401d-9775-08d4d90ab608" display-name="Card_Number">3083 2614 5022 21321</value>
  <value id="4fc261b2-f776-4fd4-8e1d-08d4d90ab608" display-name="Email_Address"><a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="177d727b7b78577679743974787a" rel="noreferrer noopener nofollow">[email protected]</a></value>
  <value id="c867d4e5-cc0b-4ee6-b911-08d6134132e0" display-name="BP_TRIGGERS_2.0">{"transactions":[{"BP_CommsRef":"V0001","BP_Offer_Expiry":"2018-10-01T00:00:00","deliveryId":"20320925","Job_Number":"A34F443","Send_Date":"2018-09-26T00:00:00"}]}</value>
</row>';

--这将检查空缺 { (您也可以搜索空缺{"transactions")

SELECT JSON_VALUE(
       @XML.query(N'/row/value[substring(text()[1],1,1)="{"]/node()')
       .value(N'text()[1]','nvarchar(max)')
       ,N'$.transactions[0].deliveryId');

--同样的方法,但查看属性 display-name

SELECT JSON_VALUE(
       @XML.query(N'/row/value[@display-name="BP_TRIGGERS_2.0"]/node()')
       .value(N'text()[1]','nvarchar(max)')
       ,N'$.transactions[0].deliveryId');

简而言之:.query() <value> 的 XML下面<row> ,它充满了过滤器。拿这个node()并阅读.value()从那里开始。
这个交给JSON_VALUE为了检索所需的deliveryId .

您可以对属性 id 执行相同的操作您可以使用声明变量 ( sql:variable() ) 或结果集中的列 ( sql:column() ) 提交值。

关于json - 遍历 XML 节点,然后检查是否有匹配的 json 值,然后选择该值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52750714/

相关文章:

android - 在数据库更改 Android 时得到通知

sql-server - 存储过程会导致内存泄漏吗?

sql-server - "Set Transaction Level"是否需要开始交易?

xml - 将 XmlNode 文本转换为整数

c# - 动态添加元素到 XML 文件

c# - XML 文件而不是 XML 字符串

java - 多态性如何与 Gson 一起工作(改造)

javascript - 使用 jQuery 根据国家和州填充州和城市下拉菜单

c++ - 用于 2D RPG 的 XML vs YAML vs JSON

javascript - 将 JSON 值发送到 PHP