Oracle之如何将分隔数据转换为IN列表

208 阅读2分钟

「这是我参与2022首次更文挑战的第13天,活动详情查看:2022首次更文挑战

今日份知识学习

今天我们来学习如何将分隔数据转换成IN函数可以使用的列表数据,一个很典型的问题,但是要写好这个SQL可是不容易。

具体讲解

现在我们先来假设有这么一个字符串:‘张三、李四、王五’,想要从user_table表中取出相应匹配的值来。

这个时候我们应该使用IN函数,比如下面的SQL:

select * from user_table where name in (.....)

但是我们并没有in函数可以用的数据,只有一个字符串数据。那我们就要做一下工作了。

1.循环取出值

之前的文章中我们说到过,循环取值一般都是用level connect by关键字。

那么这次我们也是这么使用,看如下SQL:

select level from dual connect by level <= (length(分隔符的数量) + 1)

2.分隔符的数量如何计算

这个时候我们就可以使用regexp_count()函数了,完善一下SQL:

select level from dual connect by level <= (length(regexp_count('张三、李四、王五', '、')) + 1)

3.输出指定位置的名称

继续完善SQL:

select regexp_substr('张三、李四、王五', '\[^、]+', 1, level) from dual connect by level <= (length(regexp_count('张三、李四、王五', '、')) + 1)

通过以上SQL就可以得出IN函数可用的列表数据了,随后我们再将这个SQL拼接到主SQL中。

如下SQL:

select * from user_table where name in (select regexp_substr('张三、李四、王五', '\[^、]+', 1, level) from dual connect by level <= (length(regexp_count('张三、李四、王五', '、')) + 1))

经上SQL,就可以得到应有的结果了。

总结

今天我们初步学了如何将分隔数据转换成IN列表的方法,但是并没有给分隔数据进行去重,下篇文章我们一起来看看如何给查出来的数据去重吧。

最近开始来学习Oracle数据库的一些知识,其中包含一些函数的使用,或者是特性的介绍讲解等,将会在系列文章内说到。

喜欢的可以关注一下专栏。