【问题标题】:Getting error: "Missing keyword" when using case in where clause出现错误:在 where 子句中使用大小写时出现“缺少关键字”
【发布时间】:2022-01-16 18:42:47
【问题描述】:
SELECT *
  FROM corp_action_restriction car1
  LEFT OUTER JOIN investment_account inv
    ON CASE
       WHEN REGEXP_LIKE(REGEXP_SUBSTR(car1.restriction_value,
                                      '[^|]+',
                                      1,
                                      1),
                        '^[[:digit:]]*$') THEN
        TO_NUMBER(REGEXP_SUBSTR(car1.restriction_value, '[^|]+', 1, 1)) =
        inv.investment_account_id
       ELSE
        car1.restriction_value = TO_CHAR(inv.investment_account_id)
       END

我遇到了缺少关键字错误。

谁能告诉我这个查询有什么问题?

ORA-00905:缺少关键字
00905. 00000 - “缺少关键字”
*原因:
*行动:
行错误:4 列:61

【问题讨论】:

    标签: sql oracle case


    【解决方案1】:

    因为return_exprelse_expr 不能是布尔表达式类型。 而且REGEXP_SUBSTR()的第三个和第四个参数(1&1)是多余的。

    确实不需要CASE..WHEN 表达式,如果数据库版本是12cR2+,那么考虑使用

    SELECT *
      FROM corp_action_restriction car1
      LEFT JOIN investment_account inv
        ON TO_NUMBER(
                     REGEXP_SUBSTR(
                                   car1.restriction_value, 
                                   '[^|]+'
                                  )  
                     DEFAULT NULL ON CONVERSION ERROR
                    ) = inv.investment_account_id
    

    这样你就不会因为转换而出错

    Demo

    【讨论】:

    • 谢谢这是在 19 版本中工作,但我正在寻找一个在 12 和 19 版本的 oracle 中都可以工作的解决方案。似乎我们不能在与 case 的 and 条件中使用 =
    • 我得到 ORA-00907: 如果我在 oracle 12c 中使用相同的 sql,则缺少右括号
    • 那么,您的数据库版本应该是 12c Release 1,不是吗? @维卡斯
    【解决方案2】:

    那就是

    SELECT *
      FROM CORP_ACTION_RESTRICTION CAR1
           LEFT OUTER JOIN INVESTMENT_ACCOUNT INV
              ON INV.INVESTMENT_ACCOUNT_ID =
                 CASE
                    WHEN REGEXP_LIKE (REGEXP_SUBSTR (CAR1.RESTRICTION_VALUE,
                                                     '[^|]+',
                                                     1,
                                                     1),
                                      '^[[:digit:]]*$')
                    THEN
                       TO_NUMBER (REGEXP_SUBSTR (CAR1.RESTRICTION_VALUE,
                                                 '[^|]+',
                                                 1,
                                                 1))
                    ELSE
                       CAR1.RESTRICTION_VALUE
                 END;
    

    换句话说,将inv.investment_account_id 放入ON 子句中,然后将其(与=)与case 表达式的结果进行比较。

    【讨论】:

      猜你喜欢
      • 2022-12-22
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-23
      • 2021-05-26
      • 1970-01-01
      相关资源
      最近更新 更多