一、简介
最近在工作中,同事遇到一个问题,就是前台搜索条件传递过来 “级3年制,级4年制,...”这种用逗号分隔的字符串,然后后台他想使用not in来过滤数据。于是,我们一起研究了一下,以下是同事最开始写的sql:
select *from (select f.*, f.nj || '级' || m.major_year || '年制' njyearfrom v_zhxg_jf_sfxx_ys_ss_tz_jm_tf fleft join wp_kdb_major mon f.zydm = m.major_key) twhere t.njyear not in(select regexp_replace('.级5年制.,.级4年制.', '[.]', '''')from dual)
根本没有效果,这就奇怪了。然后我们讨论了一下,其实使用in操作符的话,后面其实是接的多行结果那种格式的,观察下面两种情况。
【a】
select regexp_replace('.级5年制.,.级4年制.', '[.]', '''') from dual
【b】
select regexp_substr('级3年制,级4年制', '[^,]+', 1, level)from dualconnect by regexp_substr('级3年制,级4年制', '[^,]+', 1, level) is not null
对比以上两个sql,应该可以看出区别了吧。
二、 解决方法
select *from (select f.*, f.nj || '级' || m.major_year || '年制' njyearfrom v_zhxg_jf_sfxx_ys_ss_tz_jm_tf fleft join wp_kdb_major mon f.zydm = m.major_key) twhere to_char(t.njyear) not in(select regexp_substr('级3年制,级4年制', '[^,]+', 1, level)from dualconnect by regexp_substr('级3年制,级4年制','[^,]+',1,level) is not null)
问题解决,在此做个总结,以防后面踩坑。
如果觉得《Oracle 逗号分割的字符串转换为可放入in的语句》对你有帮助,请点赞、收藏,并留下你的观点哦!