在我们的软件中,我们使用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;
答案 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
代替子查询。