多个模糊匹配的场景
select * from {table_name} where REGEXP_LIKE(字段名称,' 值1 | 值2 | 值3 ')
但是这种情况有个问题:不走索引,相当于左右都加%
![](https://img-blog.csdnimg.cn/img_convert/eb0347a7c3411b7b3c237216e9910040.png)
instr函数也有三种情况:
暂时没发现instr可以走索引
instr(字段,’关键字’)>0相当于 字段like ‘%关键字%’
instr(字段,’关键字’)=1相当于 字段like ‘关键字%’(发现未走索引,'关键字%'走了索引)
instr(字段,’关键字’)=0相当于 字段not like ‘%关键字%’
删除重复行,记得提前备份数据,如果比较重要,最好先逻辑删除
原理就是先查询记录最新的rowid,注意如果同时多个匹配条件,可能需要执行多次,因为每次只返回重复数据的一条最新rowid
delete from {table_name} where {条件} and rowid in (select min(rowid) from {table_name} where {条件} group by {判断重复的唯一条件} having count(*)>1);
merge语句遇到的坑:
元素个数不能超过9999,所以,如果merge的条数太多会出问题,最好每次都去做个切片,list.subList
merge同时调用可能两个集合入参,你中有我,我中有你就会陷入死锁,更新的时候会行锁,方法加锁解决
merge遇到clob类型数据超长会被识别成long类型,改批量insert后通过
因为null的特殊性,merge的on 条件如果允许空值则会在更新场景失效,可以用nvl和coalesce
![](https://img-blog.csdnimg.cn/img_convert/ca3c3608462f1dd82a745104bdb03d7d.png)
oracle如果数据为null,则只有is null 能匹配,not in 和!=均无法匹配,因为null在oracle里类型是other,无法进行比较,如果非要比较则可以借助函数nvl或者coalesce
in 函数
如果同时满足类的N个字段可以用
(表字段1,表字段2,表字段3)in
<foreach close=")" collection="list" item="item" open="(" sparator=",">
(#{item.字段1},#{item.字段2},#{item.字段3})
</foreach>
oracle的列换行
1、 wm_concat
最初版本为了一条sql查询出多个数据然后分组进行列传行,用了wm_concat
wm_concat({字段});
缺点:数据量大的时候会导致把临时表空间撑爆
2、listagg
优化,修改为listagg
listagg({字段}, ',')within group(order by{字段}) as {字段};
缺点:有长度限制,拼接的字符串超过4000时会报错
3、xmlagg
rtrim(xmlagg(xmlparse(content {字段}||',' wellformed) order by {字段}).getclobval(), ',') as {字段}
缺点:数据量大的时候处理很慢
随后调整为批量查询映射然后用流进行处理,速度稍微好点,还需进一步优化