SQL_使用decode合并SQL

从一个简单的场景开始

借据科目号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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值