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 中的键数。试试吧。
我有 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 中的键数。试试吧。