3

私たちのソフトウェアでは、JDBC3ドライバータイプのデータベースとしてPostgresqlを使用しています。JDBCステートメントは、「Caseステートメント」を含む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派生物)でサポートされています。私がすぐに思いつく唯一の例外はMSAccessですが、とにかくそれを避けることをお勧めします。

したがって、さまざまなデータベースエンジンとの互換性が懸念される場合は、caseステートメントを使用しても安全です。

クエリには、caseステートメントにネストされたselectがあります。さまざまなデータベースがこれを良くも悪くも処理します-そして私はPostgresが悪い側にあると思います。

要約された表に参加することで、これを回避できます。

routine rparent
on rparent.routineid = r.parentid

そしてrparent.mreq、サブクエリの代わりに使用します。

于 2013-02-05T17:04:57.247 に答える