今日份知识学习
今天我们来学习如何将分隔数据转换成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数据库的一些知识,其中包含一些函数的使用,或者是特性的介绍讲解等,将会在系列文章内说到。
喜欢的可以关注一下专栏。