gpt4 book ai didi

XQuery 过滤器,如 Where 子句

转载 作者:行者123 更新时间:2023-12-04 19:33:22 25 4
gpt4 key购买 nike

我已经根据特定条件从 XML 值中获取数据。
想法是有一个包含两列 ID 和数据(XML 数据类型)的表。我必须获取特定 ID 的数据。

这是示例,我希望仅使用西尔斯大厦获得第一行的结果。我得到两行。

IF OBJECT_ID('tempdb..#ExistExample') IS NOT NULL
DROP TABLE #ExistExample
GO

CREATE TABLE #ExistExample
(
XMLID Int,
XMLDocument xml
)

INSERT INTO #ExistExample
VALUES (100,'<Buildings>
<Building>
<Name>Sears Tower</Name>
<Floor1>Yes</Floor1>
<Floor2>Yes</Floor2>
<Floor3>No</Floor3>
</Building>
<Building>
<Name>IDS Building</Name>
<Floor1>Yes</Floor1>
<Floor2>Yes</Floor2>
<Floor3>Yes</Floor3>
</Building>
</Buildings>')

DECLARE @data varchar(1000)
DECLARE @ID INT
SET @ID = 101
SET @data = 'Sears Tower'

INSERT INTO #ExistExample
VALUES (101,'<Buildings>
<Building>
<Name>Sears Tower</Name>
<Floor1>Yes</Floor1>
<Floor2>Yes</Floor2>
<Floor3>No</Floor3>
</Building>
<Building>
<Name>IDS Building</Name>
<Floor1>Yes</Floor1>
<Floor2>Yes</Floor2>
<Floor3>Yes</Floor3>
</Building>
</Buildings>')

--SELECT * FROM #ExistExample

SELECT
c.value('(Name/text())[1]','varchar(25)') AS BuildingName,
c.value('(Floor1/text())[1]','varchar(25)') AS Floor1,
c.value('(Floor2/text())[1]','varchar(25)') AS Floor2,
c.value('(Floor3/text())[1]','varchar(25)') AS Floor3
FROM #ExistExample
CROSS APPLY XMLDocument.nodes('/Buildings/Building') as t(c)
WHERE c.exist('//Building/Name[.=sql:variable("@data")]') = 1
AND XMLID = @ID

最佳答案

使用 :

DriverDetails/DriverDetail[ID eq 1]/*[not(self::ID)]

或者,如果您认为这更简单:
DriverDetails/DriverDetail[ID eq 1]/(PRN | Name))

这里假设(对于两个 XPath 表达式)该表达式的计算将 DriverDetails 的父节点作为初始上下文节点。 .

关于XQuery 过滤器,如 Where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6628935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com