Oracle 在查询中使用 CLOB 获取 DISTINCT 数字

Posted

技术标签:

【中文标题】Oracle 在查询中使用 CLOB 获取 DISTINCT 数字【英文标题】:Oracle get DISTINCT numeric with a CLOB in the query 【发布时间】:2014-06-12 12:12:48 【问题描述】:

编辑:我正在寻找 DISTINCT NUMERIC,同时在查询中包含 CLOB。

我有两个关系。

关系一:

LOGID_NBR           NUMBER (12)
APPID_NBR           NUMBER (2)      
EVENTID_NBR         NUMBER (10)     
KEYID_NBR           NUMBER (8)      
KEYVALUE            VARCHAR2 (100 Byte)     
ARGUMENTSXML        VARCHAR2 (4000 Byte)    
SENTINDICATOR       CHAR (5 Byte)       
RECEIVED_DATEDATE           DATE sysdate    
LAST_UPDATED        DATE    sysdate 
TEXTINDICATOR       VARCHAR2 (5 Byte)       
UPSELL_ID           VARCHAR2 (5 Byte)       
GECKOIMAGEIND       CHAR (1 Byte)       
DELIVERYTYPE        VARCHAR2 (30 Byte)      

关系二:

LOGID_NBR       NUMBER (12)     
INPUT_ARGS      CLOB    

我查询了如下关系:

SELECT EVENTID_NBR, INPUT_ARGS 

FROM RELATION_ONE, RELATION_TWO 

WHERE RELATION_ONE.LOGID_NBR = RELATION_TWO.LOGID_NBR AND 
   EVENTID_NBR BETWEEN 143 AND 192 AND 
   EVENTID_NBR != 172 AND SYSDATE - 7 >= RELATION_ONE.LAST_UPDATED 
   ORDER BY EVENTID_NBR;

我经常在我的结果集中收到相同的EVENTID_NBR,并且只对DISTINCT 结果感兴趣。但是,将 DISTINCT 关键字添加到查询中,如下所示:

SELECT DISTINCT EVENTID_NBR, INPUT_ARGS ...

产生以下错误结果:

[Error] Execution (8: 32): ORA-00932: inconsistent datatypes: expected - got CLOB

所以,我开始在网上搜索如何解决这个问题,并找到了this 甚至this。我要将此 CLOB 转换成什么,以使 DISTINCT EVENTID_NBR 及其关联的 CLOB 出现在我的结果集中?

【问题讨论】:

副本应该让您进一步了解如何获取 DISTINCT 数据集。但是,我会重新考虑这是否真的是问题所在,并首先弄清楚为什么你需要一个 DISTINCT。会不会是你的数据库没有正确规范化? @Ben 我需要一个不同的,因为每个EVENTID_NBR 都有一个不同的CLOB。因此,我可能有一百个EVENTID_NBR = 143,但每个都有不同的CLOB,因此,我只对DISTINCT 对感兴趣。 那么对于单个 eventid_nbr,您有一堆不同的 input_args (CLOB) 值,并且一些 input_args 在同一个 eventid_nbr 中是相同的? 【参考方案1】:

如果对 clob 进行哈希处理,则可以在子查询中使用它来获取具有相同 clob 哈希值的每个 eventid_nbr 的最大 rowid。然后,您只需在 where 子句中过滤您的 relationship_two 表。

SELECT EVENTID_NBR, INPUT_ARGS 

FROM RELATION_ONE, RELATION_TWO 

WHERE RELATION_ONE.LOGID_NBR = RELATION_TWO.LOGID_NBR AND 
  EVENTID_NBR BETWEEN 143 AND 192 AND 
  EVENTID_NBR != 172 AND SYSDATE - 7 >= RELATION_ONE.LAST_UPDATED

  AND (RELATION_TWO.EVENTID_NBR, RELATION_TWO.ROWID) IN
      (SELECT DISTINCT EVENTID_NBR,
       MAX(ROWID) OVER (PARTITION BY EVENTID_NBR, DBMS_HASH(INPUT_ARGS,3))
       FROM RELATION_TWO);

HASH 中的 3 指定了 SHA,但你也可以使用 MD4 (1) 或 MD5 (2) 如果你喜欢。

我认为如果 RELATION_TWO 表中有很多行,这可能会非常慢,我相信这可以写得更好,但这个概念是合理的。

【讨论】:

以上是关于Oracle 在查询中使用 CLOB 获取 DISTINCT 数字的主要内容,如果未能解决你的问题,请参考以下文章

在oracle查询clob字段的内容怎么办

oracle 中clob内容怎么查询

如何在 Oracle 中获取 CLOB 列的字节大小?

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

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

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