【问题标题】:Missing keyword exception Oracle缺少关键字异常 Oracle
【发布时间】:2016-11-24 07:02:51
【问题描述】:

为什么此查询返回 Oracle 数据库缺少关键字错误:

注意:Case 条件用于为 WHERE 条件选择适当的 where 语句。这是我正在迁移到 Oracle 的 mysql 查询。

SELECT OFFICE_TYPE_CD, OFFICE_TYPE_DESC
  FROM m_office_types
 WHERE     CASE
               WHEN OFFICE_TYPE_CD IN (7)
               THEN
                   office_level_cd < (SELECT DISTINCT office_level_cd
                                        FROM m_office_types
                                       WHERE     office_type_cd = 7
                                             AND RECORD_STATUS <> 'D')
               ELSE
                   office_level_cd <= (SELECT DISTINCT office_level_cd
                                         FROM m_office_types
                                        WHERE     office_type_cd = 7
                                              AND RECORD_STATUS <> 'D')
           END
       AND RECORD_STATUS = 'C'
       AND state_cd = 27
       AND OFFICE_NAME IS NOT NULL

【问题讨论】:

  • 请注意分享架构!
  • CASE 应该怎么做?这表示if OFFICE_TYPE_CD IN (7)CASE 值应该是office_level_cd &lt; (...),这是没有意义的。试着解释你需要用这个查询做什么
  • 因为case 表达式的使用不正确。引发 missing keyword 错误是因为您将比较运算符放在 case 表达式的 then 子句中。当您修复此Invalid relational operator 时,将引发此问题,因为在where 子句中,您必须将case 表达式的结果与某些内容进行比较。
  • 您的问题中没有 PL/SQL。我也很确定即使是 MySQL 也不允许运行它。

标签: sql oracle case


【解决方案1】:

你可能想写这样的东西:

SELECT OFFICE_TYPE_CD, OFFICE_TYPE_DESC
  FROM m_office_types
 WHERE     RECORD_STATUS = 'C'
       AND state_cd = 27
       AND OFFICE_NAME IS NOT NULL
       AND (   (    OFFICE_TYPE_CD IN (7)
                AND office_level_cd < (SELECT DISTINCT office_level_cd
                                         FROM m_office_types
                                        WHERE     office_type_cd = 7
                                              AND RECORD_STATUS <> 'D'))
            OR (    OFFICE_TYPE_CD NOT IN (7)
                AND office_level_cd <= (SELECT DISTINCT office_level_cd
                                          FROM m_office_types
                                         WHERE     office_type_cd = 7
                                               AND RECORD_STATUS <> 'D')))

请注意,它可以简化,我只是为了清楚起见才这样写

【讨论】:

    猜你喜欢
    • 2015-12-03
    • 2020-02-08
    • 2012-09-26
    • 2016-11-09
    • 1970-01-01
    • 2018-02-24
    • 2021-01-20
    • 1970-01-01
    • 2010-09-23
    相关资源
    最近更新 更多