Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类似Where子句的XQuery筛选器_Xquery_Where Clause - Fatal编程技术网

类似Where子句的XQuery筛选器

类似Where子句的XQuery筛选器,xquery,where-clause,Xquery,Where Clause,我已经从XML值中获取了基于特定条件的数据。 想法是让一个表具有两列ID和DataXML数据类型。我必须获取特定ID的数据 这是一个例子,我希望达到的结果,只有第一排西尔斯塔只。我有两排 IF OBJECT_ID('tempdb..#ExistExample') IS NOT NULL DROP TABLE #ExistExample GO CREATE TABLE #ExistExample ( XMLID Int, XMLDocument xml ) INSERT INTO #E

我已经从XML值中获取了基于特定条件的数据。 想法是让一个表具有两列ID和DataXML数据类型。我必须获取特定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]/(PRN | Name))

这里假设对于这两个XPath表达式,表达式的初始上下文节点都是DriverDetails的父节点。

得到了答案。这应该是这样的:

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.value('(Name/text())[1]','varchar(25)') = @data 
AND XMLID = @ID

我不确定这是更好的方法还是有其他方法来实现这一点。

好问题,+1。请参阅我的答案,了解两种解决方案:请考虑注册一个帐户,这样你就可以编辑你的问题并留下评论。谢谢,欢迎来到Stack Overflow。@Annie:我为您的问题提供了正确的XPath解决方案。我对SQL的理解还不足以了解您在更新问题时提出的问题,而且问题似乎是特定于SQL的。就XQuery而言,我已经为您提供了两个答案,这两个答案完全可以生成所需的数据。
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.value('(Name/text())[1]','varchar(25)') = @data 
AND XMLID = @ID