检查表是否存在,如果不使用另一个表'SELECT'语句

时间:2017-03-16 12:40:36

标签: mysql sql oracle derby

我还是SQL的新手。我正在开发一个在开发中使用Derby数据库和在生产中使用Oracle的系统。我希望有一个适用于两者的SQL语句。这是我的代码:

SELECT rma.crspdt AS bic_crspndt,
               rma.issr   AS bic_issr
        FROM   rma
        WHERE  (rma.tp = 'Issued' OR rma.tp = 'Received')
        AND    rma.rmasts = 'Enabled'
        AND    rma.svcnm = 'swift.fin') r
       INNER JOIN (SELECT 1 ID FROM SYSIBM.SYSDUMMY1 UNION ALL
                   SELECT 2 ID FROM SYSIBM.SYSDUMMY1) dummy ON (dummy.id = 1 AND r.bic_crspndt IS NOT NULL)
                                                   OR (dummy.id = 2 AND r.bic_issr IS NOT NULL)

我在这里使用'SYSIBM.SYSDUMM1'表。 Oracle有一个名为'DUAL'的'SYSIBM.SYSDUMM1'的精确替代表。问题是,当我在开发(德比)中运行我的代码时,这段代码工作正常,但在生产(oracle)中,我得到一个错误,说像未知表。

我想要做的是在我的代码中执行IF-ELSE / CASE-WHEN或类似的操作来检查运行时是否存在'SYSIBM.SYSDUMMY1'表并且如果它不存在(如在oracle中)那么我想使用'DUAL'表。我是SQL的新手,想在这件事上提供一些帮助。

3 个答案:

答案 0 :(得分:0)

您没有说明您使用的是哪个Oracle版本。在Oracle 12c中有SQL Translation Framework。 通过此示例,您可以设置转换,以便将SYSIBM.SYSDUMMY1转换为DUAL。 我见过演示,但没有亲自使用它。我建议Oracle文档(像往常一样)获取信息 - https://docs.oracle.com/database/121/DRDAA/sql_transl_arch.htm#DRDAA131

答案 1 :(得分:0)

你能不能只创建一个DUAL表

答案 2 :(得分:0)

从Oracle的角度来看,您的代码存在一些问题,我可以想到。 所以从评论中我得到的是你无法使用Dual。 Oracle中存在双重身份。因此,请尝试运行select 1 from dual,如果它不起作用,您的查询肯定不会在oracle中运行。除此之外,您的查询还有一些问题。

  1. 使用内部联接前的位置。
  2. r
  3. 的额外结束括号

    根据以上输入,如果您在Oracle中运行此查询,则此查询可能适合您。如果您不使用Oracle,请将{替换为sysibm.sysdummy

    注意:您应该使用正确的连接语法(INNER JOIN)。我无法弄清楚加入条件,因此我使用逗号加入。

    SELECT rma.crspdt AS bic_crspndt,
           rma.issr AS bic_issr
    FROM rma r,
      (SELECT 1 ID FROM dual UNION ALL
       SELECT 2 ID FROM dual) dummy
    WHERE ( (dummy.id = 1
             AND r.bic_crspndt IS NOT NULL)
           OR (dummy.id = 2
               AND r.bic_issr IS NOT NULL) 
         )
      AND (rma.tp = 'Issued'
           OR rma.tp = 'Received')
      AND rma.rmasts = 'Enabled'
      AND rma.svcnm = 'swift.fin'