2

我有 XML 作为输入,但我不清楚我需要如何设置数据和语句以从中获取值。我的 XML 如下:

<Keys>
    <key>246</key>
    <key>247</key>
    <key>248</key>
</Keys>

我想做以下事情(简化以表达我的观点)

Select *
From Transaction as t
Inner Join @InputXml.nodes('Keys') as K(X)
    on K.X.value('@Key', 'INT') = t.financial_transaction_grp_key

谁能提供我会怎么做?我在 SQL 中的第 3/4 行会是什么样子?谢谢!

4

2 回答 2

0

您可能需要使用正则表达式将 XML 解析为可读格式。

我编写了一个类似的事件来从保存在表中的 xmlpayload 解析活动数据库。这可能适合您,也可能不适合您,但您至少应该能够开始。

SELECT SUBSTRING(column FROM IF(locate('<key>',column)=0,0,0+LOCATE('<key>',column))) as KEY FROM table LIMIT 1\G

于 2019-10-24T18:09:16.257 回答
0

从您的代码中,我假设这是 SQL-Server,但您添加了标签[mysql]……
对于您的下一个问题,请记住,了解您的工具(供应商和版本)非常重要。

假设T-SQL并且[sql-server](根据提供的示例代码)您很接近:

DECLARE @InputXml XML=
N'<Keys>
    <key>246</key>
    <key>247</key>
    <key>248</key>
</Keys>';

DECLARE @YourTransactionTable TABLE(ID INT IDENTITY,financial_transaction_grp_key INT);
INSERT INTO @YourTransactionTable VALUES (200),(246),(247),(300);

Select t.*
From @YourTransactionTable as t
Inner Join @InputXml.nodes('/Keys/key') as K(X)
    on K.X.value('text()[1]', 'INT') = t.financial_transaction_grp_key;

什么问题:

  • .nodes()必须向下到重复元素,即<key>
  • .value()您使用 path@Key时,这在两个方面都是错误的:1)<key>是元素而不是属性,2)XML 严格区分大小写,所以Key!=key.

另一种可能是这样的:

WHERE @InputXml.exist('/Keys/key[. cast as xs:int? = sql:column("financial_transaction_grp_key")]')=1;

哪个更快取决于源表中的行数以及 XML 中的键数。试试看。

于 2019-10-25T09:12:30.580 回答