sql记录

多个模糊匹配的场景

select * from {table_name} where REGEXP_LIKE(字段名称,' 值1 | 值2 | 值3 ')

但是这种情况有个问题:不走索引,相当于左右都加%

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语句遇到的坑:

  1. 元素个数不能超过9999,所以,如果merge的条数太多会出问题,最好每次都去做个切片,list.subList

  1. merge同时调用可能两个集合入参,你中有我,我中有你就会陷入死锁,更新的时候会行锁,方法加锁解决

  1. merge遇到clob类型数据超长会被识别成long类型,改批量insert后通过

  1. 因为null的特殊性,merge的on 条件如果允许空值则会在更新场景失效,可以用nvl和coalesce

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 {字段}

缺点:数据量大的时候处理很慢

随后调整为批量查询映射然后用流进行处理,速度稍微好点,还需进一步优化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值