Bootstrap

oracle定义函数FIND_IN_SET

需求:在oracle数据库中有下方表格所示类型的一个列,每个值都是由ID拼接的字符串,用户希望能针对这个列做到数据检索,要求数据值只要包含传入值,即视为满足检索条件。


笔者的第一反应就是:简单!!!
二话不说立马写SQL

select t.* from TABLE_T t where instr(t.ids, '8') > 0


运行,这个时候发现结果如下:


上述的查询结果其实是不满足条件的,因为我传入一个’8’,按照正常情况应该只查询出第4条数据才对,但是因为’6,88’也包含了’8’,所以也查出来了。

想了一想,IN和LIKE肯定也满足不了需求啊,但是应该已经有大佬解决过了,于是百度了一番,果然:


CREATE OR REPLACE
FUNCTION FIND_IN_SET(piv_str1 varchar2, piv_str2 varchar2, p_sep varchar2 := ',')
RETURN NUMBER IS
  l_idx    number:=0; -- 用于计算piv_str2中分隔符的位置
  str      varchar2(5
;