【问题标题】:Dealing with XMLType columns in Oracle在 Oracle 中处理 XMLType 列
【发布时间】:2015-10-24 16:34:45
【问题描述】:

我有一个带有 XMLType 列的表格,其内容如下:

<root>
 <item>
  <case>1234</case>
  <open>1</open>
 </item>
 <item>
  <case>2345</case>
  <open>0</open>
 </item>
 <item>
  <case>3456</case>
  <open>1</open>
 </item>
 /* ..other item blocks may follow.. */
</root>

我想检查是否有打开/关闭的案例。
我应该在查询 WHERE 子句中输入什么?

目前,我让它以最糟糕的方式工作:

SELECT somecolumn FROM sometable 
WHERE INSTR(EXTRACT(myxmlcolumn, '//open/text()'), '1') > 0

基本上,我将所有打开元素的值“展平”为一个字符串(在上面的示例 xml 中:101),然后找出是否出现了 0 关闭或 1 打开。我需要更好的可以索引的东西以避免全表扫描。

有没有什么方法可以通过 SQL 查询检索相应“open”值设置为10 的“case”元素?

我目前正在通过解析整个 XML 的应用程序代码执行此操作,因为我无法从 Oracle 端找到有关如何执行此操作的任何文档。

谢谢

【问题讨论】:

    标签: xml oracle xmltype


    【解决方案1】:

    可以通过XPATH来完成:

    select myxmlcolumn.EXTRACT('//item[open=0]/case') from sometable
    

    如果两者都需要,则 open = 1 OR =0 然后

    select myxmlcolumn.EXTRACT('//item[open=0 | open=1]/case') from sometable
    

    【讨论】:

    • 这很有魅力,但我已将查询修改为:select EXTRACT(myxmlcolumn, '//item[open=1]/case') from sometable。我还能够在其上创建索引,但需要将 .getStringVal() 放在 EXTRACT 函数的末尾以使其工作。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2012-12-01
    • 2012-07-19
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 2018-11-04
    相关资源
    最近更新 更多