【问题标题】:SQL Query to iterate within XML Nodes to check for a value and return the recordSQL Query 在 XML 节点中进行迭代以检查值并返回记录
【发布时间】:2020-12-01 10:17:35
【问题描述】:

我的一个数据库表有多个记录。在每条记录中都有一列存储以下类型的 XML。我需要编写一个查询,它应该获取父节点内的记录,如果任何子节点只包含值 0 完全。在这个例子中,第四个节点包含所有的 0。这满足条件,必须获取记录。我可以知道如何在 SQL 中编写这个条件来获取这样的数据吗?

注意:父节点可能包含多个子节点。

XML:

        <videoDetails>
            <video>
                <V1>
                    <display>0</display>
                </V1>
                <V2>
                    <display>0</display>
                </V2>
                <V3>
                    <display>0</display>
                </V3>
                <V4>
                    <display>0</display>
                </V4>
                <V5>
                    <display>1</display>
                </V5>
            </video>
            <video>                 
                <V1>
                    <display>0</display>
                </V1>
                <V2>
                    <display>0</display>
                </V2>
                <V3>
                    <display>1</display>
                </V3>
                <V4>
                    <display>0</display>
                </V4>
                <V5>
                    <display>0</display>
                </V5>
            </video>
            <video>                 
                <V1>
                    <display>0</display>
                </V1>
                <V2>
                    <display>1</display>
                </V2>
                <V3>
                    <display>0</display>
                </V3>
                <V4>
                    <display>0</display>
                </V4>
                <V5>
                    <display>1</display>
                </V5>
            </video>
            <video>                 
                <V1>
                    <display>0</display>
                </V1>
                <V2>
                    <display>0</display>
                </V2>
                <V3>
                    <display>0</display>
                </V3>
                <V4>
                    <display>0</display>
                </V4>
                <V5>
                    <display>0</display>
                </V5>
            </video>
        </videoDetails>
         

我尝试使用 NOT xmlexists('$N/../../../videoDetails/video[1]/*[display=1]' 将 USER_VIDEO_XML 传递为 "N") 之类的东西。这仅在 XML 包含一个全为 0 的节点且不适用于多个节点时才有效。

请求您的宝贵意见。

【问题讨论】:

  • XML 支持高度特定于供应商 - 所以请添加标签以指定您是否使用mysql、postgresql、sql-server、oracle或db2 - 或完全不同的东西。
  • 您的 xPath 强制它只查看第一个

标签: sql xml db2 xquery-sql


【解决方案1】:

使用以下查询:

SELECT 1
FROM MY_TAB T
WHERE XMLCAST(XMLQUERY
(
'
let $d :=
for $v in $doc/videoDetails/video
  return fn:exists($v/*[display != 0])
return fn:exists($d[. = fn:false()])
' PASSING T.DOC AS "doc" 
) AS INT) = 1

for 循环迭代所有 video 子节点,并为您的给定示例返回 $d 中的以下序列:
(true, true, true, false)
4 个video 子节点。其中前 3 个包含 display !=0,但第 4 个不包含。 如果上面的序列包含false 值,则外部return 子句返回true。 您可以通过以下db<>fiddle 链接使用示例数据检查结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多