oracle 多个not like,orcle not like不建议使用(not like所踩过的坑!)

1.情景展示

现在有一张表,需要将表中某字段的值不是以指定字符开头的列进行删除,如何实现?

2.问题分析

错误方案一:同事想到的是:这种方式

4d2be785e12f7f3890c58ddde58fe44d.png

咱们来看一下,这个表总共有多少条数据

5abd8eb4ffd2c0aa8fc21bf68db19024.png

本来表数据总共才4万多条数据,然而使用上面的查询方式,却查出了1多个亿的数据,真不知道这数据库是怎么想的。

错误方案二:既然不行,我首先想到的是:使用not like实现,实践结果如下:

e277fc4bb33088dc48075dd80c6d1c33.png

再来看一下,使用like查询有多少条数据。

b44bea5857d9c7c2b0361d328c93347b.png

总共的数据为:40059+3972=44031条 数据,比总表数44295要少,也就是说:使用not like查询会遗漏数据,具体什么原因想不通。

3.解决方案

正确方案一:既然not like不行,我就想到用了使用exists()实现。

先来查查符合条件的,使用exists()查询一下与使用like的语句是否一致。

e356e246dcb6ad5ff0a26b11fde62fc9.png

结果一致,再看一下,使用not exists()的查询结果

9ad7657cf1b70ce2f6bda5d0849a2297.png

算一下,与总数是否一致:40323+3972=44295,与结果一致,大功告成!

--查询表中不是以0.1.2.开头的数据(使用exists实现)

SELECT COUNT(1)

FROM BASE_ORG_INFO T

WHERE NOT EXISTS

(SELECT 1

FROM (SELECT ORGID FROM BASE_ORG_INFO WHERE ORGSEQ LIKE '0.1.2.%') S

WHERE S.ORGID = T.ORGID)

如何删除这些数据?

--删除表中某字段不是以0.1.2.开头的数据(使用IN+EXISTS实现)

DELETE FROM BASE_ORG_INFO T2

WHERE T2.ORGID IN (SELECT T.ORGID

FROM BASE_ORG_INFO T

WHERE NOT EXISTS (SELECT 1

FROM (SELECT ORGID

FROM BASE_ORG_INFO

WHERE ORGSEQ LIKE '0.1.2.%') S

WHERE S.ORGID = T.ORGID))

执行结果:

6919f425d51850e3e7feb6652958c182.png

方案二:直接使用not in()就可以搞定的事情,饶了一大圈!!!

DELETE FROM BASE_ORG_INFO T2

WHERE T2.ORGID IN

(SELECT T.ORGID

FROM BASE_ORG_INFO T

WHERE T.ORGID NOT IN

(SELECT ORGID FROM BASE_ORG_INFO WHERE ORGSEQ LIKE '0.1.2.%'))

执行结果如下:

9660d1597bbb76250cd2d9d7dc4fb837.png

写在最后

哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

相关推荐:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值