Merge into条件SQL实现动态插入或更新(Oracle)
in OracleSQL数据库 with 0 comment

Merge into条件SQL实现动态插入或更新(Oracle)

in OracleSQL数据库 with 0 comment

Oracle原生的Merge Into条件语句非常实用,可以根据查询的结果判断进行插入或更新的分支操作,书写简易还有点逼格,一起了解下

Oracle_SQL2.jpg

关于Merge into

今天米虫分享Oracle中的Merge into语法
米虫是在做应用版本间数据库记录升级的时候,学到这个写法
一般我们升级数据库记录,都是直接写update语句
如果这个记录压根不存在,那就尴尬了
比较屌丝的做法是,先delete相关的记录再insert记录
这样可以保证执行不出错
比如:

delete from mebugs_run WHERE VS = 'IM_OLD';
commit;
insert into mebugs_run (VS, RUNNAME) VALUES ('IM_OLD', 'IM_NEW');
commit;

虽然米虫很屌丝(好像暴露了什么)
但是写SQL得看起来高端一些
记得SQL Sever可以通过if...else...实现条件入库
那么Oracle呢?于是发现Merge into语句(Oracle 9i引入)
从性能上考虑使用Merge into也会比先删后插来的更好

Merge into语句实例

MERGE INTO mebugs_run T1
--检查IM_OLD这个字符串在mebugs_run表的VS列是否存在
USING (SELECT 'IM_OLD' VS FROM dual) T2
ON ( T1.VS=T2.VS)
WHEN MATCHED THEN
    --存在进行UPDATE
    UPDATE SET T1.RUNNAME = 'IM_NEW'
WHEN NOT MATCHED THEN
    --不存在进行INSERT
    INSERT (VS, RUNNAME) VALUES ('IM_OLD', 'IM_NEW');
commit;

官方特别说明

在一个同时存在Insert和Update语法的Merge语句中

这里一定要注意USING后面的条件语句
米虫这里的写法FROM dual最终只会update表中VS = 'IM_OLD'的记录
因为T2只会返回一个结果
如果把SELECT 'IM_OLD' VS FROM dual改成SELECT VS FROM mebugs_run WHERE VS = 'IM_OLD' 那么这个句子就无法insert了,因为不存在该记录的时候条件语句返回直接是空
所以,Merge into还是很危险的
说不得本来想更新一条记录,一不小把整个表刷个遍(那你就要绝望了)
重点关注USING条件语句返回的情况

Responses