查询包含 CLOB 数据类型的两个表

Posted

技术标签:

【中文标题】查询包含 CLOB 数据类型的两个表【英文标题】:Querying two tables containing CLOB datatype 【发布时间】:2012-12-06 13:08:48 【问题描述】:

我有两张桌子:Table1Table2Table1 具有列 RECORDIDDATASOURCETYPESTRINGCLOB,而 Table2 具有列 RECORDIDTIMESTAMPCLICKTYPE。我编写了一个查询来从STRINGCLOB 列中查找clob XML 字符串“book”,前提是它与给定的DATASOURCETYPE 匹配,如下所示:

SELECT SUBSTR(stringclob, instr(stringclob, 'type>')+5
                        , instr(stringclob,'</type') 
                             - instr(stringclob, 'type>')-5
             ) r_type from Table1
 where DataSourceType = 'Source1'
   AND SUBSTR(stringclob, instr(stringclob,'type>')+5
                        , instr(stringclob, '</type')
                              - instr(stringclob, 'type>')-5
             )
     like '%book%'

现在,我想查找并计算上个月记录的 STRINGCLOB 列 (Table1) 中出现的所有 '%book%' 字符串(类似于 AND TIMESTAMP &gt; '01-Nov-12' AND TIMESTAMP &lt; '01-Dec-12')和 @ 987654338@。我正在努力从两个不同的表中查询数据,知道吗?

非常感谢,

我。

【问题讨论】:

不太确定我是否理解这个问题,但如果这是 XML 数据,为什么不使用 XMLType 和 xpath 等? 杰克,感谢您的评论。我不熟悉 XML 类型,但它看起来是解决问题的正确方法。谢谢。 @ilariac: 能否请您在查询中添加 FROM 子句。 @Gaurav 谢谢,我没注意到它不见了。 【参考方案1】:

这是您获取值为book 的record_type 计数的方法。

WITH t
       AS (SELECT   '<?xml version="1.0" encoding="UTF-8"?>
                       <record>
                        <record_number>12345</record_number>
                         <record_type> book </record_type>
                       </record>'
                       STRINGCLOB
             FROM   DUAL
           UNION ALL
           SELECT   '<?xml version="1.0" encoding="UTF-8"?>
                          <record>
                            <record_number>6789</record_number>
                            <record_type> book </record_type>
                         </record>'
                       STRINGCLOB
             FROM   DUAL)
SELECT   COUNT (1) total
  FROM   t
 WHERE   xmltype (t.STRINGCLOB).EXTRACT ('//record_type/text()') LIKE '%book%';

总计

2

现在,如果你想加入表2,基于record_id

 SELECT   COUNT (1) total
   FROM   table1 t1, table2 t2
  WHERE   xmltype (t1.STRINGCLOB).EXTRACT ('//record_type/text()') LIKE
            '%book%'
         AND t1.record_id = t2.record_id
         AND t1.DataSourceType = 'Source1'
         AND (TRUNC (t2.timestamp) > '01-Nov-12'
              AND TRUNC (t2.timestamp) < '01-Dec-12')
         AND t2.clicktype <> 'Type1'

【讨论】:

以上是关于查询包含 CLOB 数据类型的两个表的主要内容,如果未能解决你的问题,请参考以下文章

如何导出含有CLOB字段的表数据?

数据库CLOB型字段是啥数据类型?

从 CLOB 数据类型列生成 Oracle JSON

Oracle中如何查询CLOB字段类型的内容

java clob

如何从 SQL 查询处理 Excel 中的 Clob 数据类型