SQL:使用 XML 作为输入进行内连接

SQL: Using XML as input to do an inner join

我有 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 行会是什么样子? 谢谢!

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

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

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

根据你的代码,我假设这是 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() 中,您使用的是路径 @Key,这在两个方面都是错误的:1) <key> 是一个元素而不是属性,并且 2) XML 严格区分大小写,因此 Key!=key.

另一种可能是:

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

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