把逻辑放到查询中
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的宿主语言中。






