【问题标题】:Expected-Got CLOB datatype预期获得的 CLOB 数据类型
【发布时间】:2020-12-27 13:35:25
【问题描述】:

我遇到了一个问题,不知道该怎么办。在我的表中,我的列类型为 CLOB,在我的 SELECT 中,我使用此列,但无法从 select 语句中删除。

不知何故,我尝试将其更改为 VARCHAR(255),但我的表包含数据和备份表,并且再次恢复将花费我时间。到目前为止,这是我的 SELECT 查询:

SELECT * FROM 
   (SELECT a.*,
           df.Name AS PaymentTypeName 
    FROM  ata a 
    INNER JOIN debitform df ON a.PaymentType = df.Id 
    WHERE a.Deviation = '1' 
    AND a.ProjectID = 141 
    AND a.ParentAta = '0' 
    AND TYPE = 1 
    UNION 
    SELECT a.*,  
           df.Name AS PaymentTypeName 
    FROM  ata a 
    INNER JOIN debitform df ON a.PaymentType = df.Id 
    WHERE a.Deviation = '1' 
    AND a.ProjectID = 141 
    AND a.ParentAta = '0' 
    AND TYPE = 0 
    AND a.BecomeExternalAtaFromInternal = 1) a

这给出了错误:

第 1 行出现错误:
ORA-00932: 不一致的数据类型: 预期 - 得到 clob

任何建议和评论如何消除此类错误。

【问题讨论】:

    标签: sql oracle set-operations


    【解决方案1】:

    由于 UNION 子句,您会收到此错误。 UNION 实现了不同的排序操作,而我们不能在 CLOB 上执行这些操作。

    最简单的选择是更改为 UNION ALL。理论上,这可能会将重复项引入最终结果集中,尽管考虑到每个子查询的 WHERE 标准,这似乎不太可能。

    另外,您似乎可以完全取消 UNION,方法是像这样重写您的查询:

    SELECT * FROM 
       (SELECT a.*,
               df.Name AS PaymentTypeName 
        FROM  ata a 
        INNER JOIN debitform df ON a.PaymentType = df.Id 
        WHERE a.Deviation = '1' 
        AND a.ProjectID = 141 
        AND a.ParentAta = '0' 
        AND (TYPE = 1 
             OR (TYPE = 0 
                 AND a.BecomeExternalAtaFromInternal = 1)
            )
        )a  
    

    这种方法可能更有效。

    【讨论】:

    • @SalvatoreFerchentoGiuliano - 不客气。请注意,我在您接受时扩展了我的答案,因此请考虑我建议的替代解决方案。
    • 当然,我明白了:) 我使用第一个解决方案UNION ALL
    猜你喜欢
    • 2017-07-16
    • 2016-10-22
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多