可以在常规/准备好的JDBC语句中安全地使用“Case语句”吗?

时间:2013-02-05 15:18:18

标签: sql jdbc case

在我们的软件中,我们使用Postgresql作为具有JDBC3驱动程序类型的数据库。我们的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;

1 个答案:

答案 0 :(得分:3)

case语句是标准SQL,几乎所有数据库都支持它 - Oracle(最旧版本除外),MySQL,SQL Server,DB2,Postgres和所有Postgres衍生产品。我可以轻易想到的一个例外是MS Access,但我建议你不要这样做。

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

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

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

routine rparent
on rparent.routineid = r.parentid

然后使用rparent.mreq代替子查询。