首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

把逻辑放到查询中

Program Logic into Queries

在数据库应用程序中实现过程逻辑(procedural logic)的方法有几种。SQL语句内部可实现某种程度上的过程逻辑(尽管SQL语句应该说明做什么,而不是怎么做)。即便内嵌式SQL的宿主语言(host language)非常完善,依然推荐尽量将上述过程逻辑放在SQL语句当中,而不是宿主语言当中,因为前一种做法效率更高。过程性语言(Procedural language)的特点在于拥有执行迭代(循环)和条件(if ... then ... else 结构)逻辑的能力。SQL不需要循环能力,因为它本质上是在操作集合,SQL只需要执行条件逻辑的能力。

条件逻辑包含两部分——IF和ELSE。要实现IF的效果相当容易——where子句可以胜任,困难的是实现 ELSE 逻辑。例如,要取出一些记录,然后对其分组,每组进行不同的转换。case 表达式(Oracle 早已在decode()(注1)中提供了功能等效的操作符)可以容易地模拟ELSE逻辑:根据每条记录值的不同,返回具有不同值的结果集。下面用伪代码(pseudocode)表达case 结构的使用(注2):

CASE

WHEN condition THEN <return something to the result set>

   WHEN condition THEN <return something else>

...

   WHEN condition THEN <return still something else>

   ELSE <fall back on this value>

END

数值或日期的比较则简单明了。操作字符串可以用Oracle 的 greatest()或least(),或者MySQL的strcmp()。有时,可以为insert语句增加过程逻辑,具体办法是多重insert及条件insert(注3),并借助 merge 语句。如果 DBMS 提供了这样语句,毫不犹豫地使用它。也就是说,有许多逻辑可以放入 SQL 语句中;虽然仅执行多条语句中的一条这种逻辑价值不大,但如果设法利用 case、merge 或类似功能将多条语句合并成一条,价值可就大了。

总结:只要有可能,应尽量把条件逻辑放到 SQL语句中,而不是SQL的宿主语言中。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论