【问题标题】:Case causing ORA-01790: expression must have same datatype as corresponding expression error导致 ORA-01790: 表达式必须具有与相应表达式错误相同的数据类型的情况
【发布时间】:2014-09-11 21:11:50
【问题描述】:

我收到 ORA-01790:表达式必须具有与相应表达式错误消息相同的数据类型。下面是我正在使用的 sql。 CASE 语句是否会导致此问题?我是 sql 新手,这是我第一次尝试使用 UNION 语句。我尝试过加入而不是 UNION,但我尝试过的任何加入都会导致prior_amt 字段为空白。感谢您的帮助............

SELECT 
    pa.BUSINESS_UNIT as BUS_UNIT, 
    pa.DESCR AS DESCRIPT,
    pdr.DEPTID AS DEPTID, 
    pdr.ASSET_ID AS ASSET_NO, 
    pdr.ACCOUNT_AD AS ACCT_AD, 
    pdr.BOOK AS BOOK,

    MAX(CASE WHEN (pdr.FISCAL_YEAR =2014 AND pdr.ACCOUNTING_PERIOD =11) THEN  pdr.DEPR END) as CURRENT_AMT,
    MAX(CASE WHEN (pdr.FISCAL_YEAR =2104 AND pdr.ACCOUNTING_PERIOD =10) THEN pdr.DEPR  END) as PRIOR_AMT,

    '' AS ACCT_DE,
    '' AS JRNL_ID,
    '' AS JRNL_DT

    FROM PS_ASSET pa

    INNER JOIN PS_DEPR_RPT pdr 
    ON pa.ASSET_ID = pdr.ASSET_ID
    AND pa.BUSINESS_UNIT = pdr.BUSINESS_UNIT

    WHERE 
    pa.BUSINESS_UNIT='A0465'
    AND pdr.BOOK='PERFORM'
    AND ((pdr.FISCAL_YEAR=2014 AND pdr.ACCOUNTING_PERIOD=11) 
    OR (pdr.FISCAL_YEAR=2014 AND pdr.ACCOUNTING_PERIOD=10))

    group by
    pa.business_unit,
    pa.descr,
    pdr.deptid,
    pdr.asset_id,
    pdr.account_ad,
    pdr.book

UNION ALL

    select
    '' as BUS_UNT,
    '' AS DESCRIPT,
    '' AS DEPTID, 
    '' AS ACCT_AD, 
    '' AS BOOK,
    '' AS CURRENT_AMT,
    '' AS PRIOR_AMT,
    pdl.asset_id AS ASSET_NO,
    pdl.account AS ACCT_DE,
    pdl.journal_id AS JRNL_ID,
    pdl.journal_date AS JRNL_DT

    from ps_dist_ln pdl

    where
    book = 'PERFORM'
    and business_unit = 'A0465'
    and fiscal_year = 2014
    and accounting_period = 11
    and distribution_type = 'DE'

【问题讨论】:

    标签: sql oracle11g


    【解决方案1】:

    您的问题是您在联合的每一半中以不同的顺序放置列。两半之间的列必须以相同的顺序匹配。这与 CASE 表达式无关。

    另外,你写的 2104 应该是 2014 年。

    【讨论】:

    • 感谢您的帮助。我把2104改成了2014。我还发现第二部分的BUS_UNT应该是BUS_UNIT。除此之外,我看不出列顺序有什么不同。我看了又看。你能指出不同之处吗?谢谢。
    • 谢谢............我是一名会计师,并且正被转移到更多的编程角色中。除了在一所当地大学的几天课程之外,我没有接受过任何正式的 sql 培训;这不包括 UNION 语句。像列必须按相同的顺序排列的事情,这是我以前从未知道的,这让我绊倒了。
    • 谢谢你!我不知道为什么我的 UNION 会给出这个错误。 :)
    • 7 年后,谢谢!我讨厌 oracle sql -___-
    【解决方案2】:

    我遇到了这种错误的奇怪情况:

    我在特定行收到ORA-01790: expression must have same datatype as corresponding expression 错误消息。

    例子:

    INSERT  INTO TABLE_TO_INSERT (
                         COL_FIELD_1
                        ,COL_FIELD_2
                        ,COL_FIELD_3
                        ,COL_FIELD_4
                        ,COL_FIELD_5
                        ,COL_FIELD_6
                        )
    SELECT  1
           ,2
           ,'IMPORT'
           ,'EXPORT'
           ,COL_DEXPIRATION ---- > SQL Developer shows ORA-01790 at this error line.
           ,COL_DEXPIRATION
    FROM SOURCE_TABLE_1
    UNION 
    SELECT  1
           ,2
           ,'LOADING'
           ,'SAVING'
           ,COL_DCONFIRMDATE 
           ,COL_DATTACHMENTDATE
    FROM SOURCE_TABLE_2;
    

    就我而言,错误出现在带有UNIONSELECT 语句中;但是,当我进一步检查错误的根源时,错误确实是由SELECT 语句中使用的列的数据类型之间的不匹配造成的,但不是在 SQL Developer 中显示的红色突出显示的行中,而是在下一个SELECT 声明

    我进行了更改,存储过程编译成功。

    例子:

    INSERT  INTO TABLE_TO_INSERT (
                         COL_FIELD_1
                        ,COL_FIELD_2
                        ,COL_FIELD_3
                        ,COL_FIELD_4
                        ,COL_FIELD_5
                        ,COL_FIELD_6
                        )
    SELECT  1
           ,2
           ,'IMPORT'
           ,'EXPORT'
           ,COL_DEXPIRATION 
           ,COL_DEXPIRATION
    FROM SOURCE_TABLE_1
    UNION 
    SELECT  1
           ,2
           ,'LOADING'
           ,'SAVING'
           ,CAST(COL_DCONFIRMDATE AS VARCHAR2 (500)) -- > The real ORA-01790 was at this line and this was the change made.
           ,CAST(COL_DATTACHMENTDATE VARCHAR2 (500)) -- > The real ORA-01790 was at this line and this was the change made.
    FROM SOURCE_TABLE_2;
    

    TL;DR:Oracle 很奇怪,请检查高亮行之外的错误,并尽可能保持代码整洁有序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多