首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在JDBC的常规/准备语句中可以安全地使用“Case语句”吗?

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

Stack Overflow用户
提问于 2013-02-05 15:18:18
回答 1查看 1.9K关注 0票数 3

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

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

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-05 17:04:57

SQL语句是标准的case,几乎所有的数据库都支持它-- Oracle (除了最旧的版本)、MySQL、SQL Server、DB2、Postgres和所有Postgres的派生数据库。我可以很容易想到的一个例外是MS Access,但我建议您无论如何都要避免这样做。

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
routine rparent
on rparent.routineid = r.parentid

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14710806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文