3

在我们的软件中,我们使用 Postgresql 作为具有 JDBC3 驱动程序类型的数据库。我们的 JDBC 语句使用包含“Case statement”的 SQL。

如果我们切换到另一个驱动程序或数据库,此代码是否有效:

例子:

SELECT r.routineid, 
       r.routinetypeid, 
       CASE WHEN (pc.version=20 and pc.parentid>0) 
            THEN CASE WHEN (r.processed='t') 
                      THEN pc.processed ELSE r.processed 
                 END 
            ELSE r.processed 
       END AS processed, 
       CASE WHEN (r.version=2 and r.parentid>0) 
            THEN (SELECT m_req 
                    FROM routine 
                   WHERE routineid=r.parentid
                 ) 
            ELSE r.m_req 
       END AS m_req, 
       r.version 
  FROM (SELECT * 
          FROM routine 
         WHERE routinetypeid in (11,12) 
           AND (fbroutineid='130' OR fbroutineid='806')
       ) AS r 
       LEFT JOIN 
       routine pc 
       ON r.routineid=pc.parentid 
ORDER BY r.routinetypeid;
4

1 回答 1

3

case语句是标准 SQL,几乎所有数据库都支持——Oracle(最旧的版本除外)、MySQL、SQL Server、DB2、Postgres 和所有 Postgres 衍生产品。我很容易想到的一个例外是 MS Access,但我还是建议您避免这种情况。

因此,如果您关心的是不同数据库引擎的兼容性,那么您应该对 case 语句保持安全。

您的查询在语句中有一个嵌套选择case。不同的数据库会更好或更差地处理这个问题——我猜 Postgres 的情况更糟。

您可以通过加入汇总表来解决此问题:

routine rparent
on rparent.routineid = r.parentid

然后使用rparent.mreq而不是子查询。

于 2013-02-05T17:04:57.247 回答