从一个简单的场景开始
借据科目号ACCTNO有18位,第8位往后截取8个字符作为科目号.你可能会有如下字段映射:
select substr(acctno,8,8) from table1 left join table2 on.....
后面经过系统分析,发现有几条19位的,需要从第9位开始往后截取8个字符.
看到同事最不加思索的写法就是where选择位数等于18位的然后截取,另外一个SQL是用where选择位数等于19位的,然后union all....写完后发现,居然还有17位的,哈哈哈
select substr(acctno,8,8) from table1 left join table2 on.....where length(acctno)=18
union
select substr(acctno,9,8) from table1 left join table2 on.....where length(acctno)=19
当然,稍微优化一点的写法是,使用legth判断借据科目号的长度,然后选择执行相应表达式,如下:
select decode(length(acctno),18,substr(acctno,8,8),19,substr(acctno,9,8)) from table1 left join table2 on.....
进阶
上面的例子很容易理解,进行一波抽象,我们可以发现,上面两个SQL的表连接相同的时候(from之后where之前),我们可以用decode判断条件来选择性地执行对应的表达式
更进一步的,如果有几个SQL,表连接的表还是那几张表,连接方式还是那样,但是连接条件不一样,我们是否能用decode函数合并呢.答案是可以的.我们可以使用decode来实现有选择的做表连接.再字段映射里面同样使用decode函数执行对应的字段表达式.这样就实现了多个SQL合并为一个SQL.