【问题标题】:Find all "null" values using xquery使用 xquery 查找所有“空”值
【发布时间】:2013-05-21 22:27:07
【问题描述】:

我的任务是查找<nodeA> 为空的所有值。这可能意味着它为 NULL,或者它不存在。

我制作了以下查询

SELECT *
FROM table
WHERE AttributeList.value ('(/AttributeList/nodeA)[1]', 'varchar(50)') IS NULL

但是它只返回类似于<AttributeList />的结果

我很好奇的是这是否也会返回一个看起来像的 XML

<AttributeList>
    <nodeA></nodeA>
</AttributeList>

【问题讨论】:

    标签: sql-server xml sql-server-2008-r2 xquery


    【解决方案1】:

    无需从 XML 中提取值。请改用exist

    select *
    from YourTable 
    where AttributeList.exist('/AttributeList/nodeA/node()') = 0
    

    【讨论】:

    • 所以/AttributeList/nodeA 对我来说很有意义。但是我要为node() 填写什么?如果该节点中实际上有一个 0,那么 0 会是,还是 IS NULL
    • @mhopkins321 你不应该用任何东西替换 node() 。它寻找任何类型的节点。 0 表示没有找到节点。如果在哪里找到节点,则无论有多少节点与表达式匹配,存在的返回值都是 1。
    • hmmm,当我运行这个时,我得到&lt;AttributeList /&gt;(正确返回)和&lt;AttributeList&gt;&lt;nodeA&gt;value1&lt;/nodeA&gt;&lt;/AttributeList&gt;(返回不正确)
    • @mhopkins321 看看这个SQL Fiddle 不符合你的要求吗?
    • 伙计,这很令人困惑。这正是我想要的,但它对我不起作用。让它工作。正在做相当于nodea 而不是正确的nodeA
    【解决方案2】:

    使用fn:empty(...) 检查是否有孩子。如果需要,请记住处理属性和其他节点(元素、文本节点等)。

    //*[empty( (./node(), ./attribute()) )]
    

    W3schools.com has a nice overview on axis steps 如果你想重新定义“空”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      • 2012-02-02
      • 2017-01-01
      • 1970-01-01
      • 2012-08-18
      相关资源
      最近更新 更多