版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Weixiaohuai/article/details/84789139
一、简介
最近在工作中,同事遇到一个问题,就是前台搜索条件传递过来 “2018级3年制,2018级4年制,...”这种用逗号分隔的字符串,然后后台他想使用not in来过滤数据。于是,我们一起研究了一下,以下是同事最开始写的sql:
select *
from (select f.*, f.nj || '级' || m.major_year || '年制' njyear
from v_zhxg_jf_sfxx_ys_ss_tz_jm_tf f
left join wp_kdb_major m
on f.zydm = m.major_key) t
where t.njyear not in
(select regexp_replace('.2018级5年制.,.2018级4年制.', '[.]', '''')
from dual)
根本没有效果,这就奇怪了。然后我们讨论了一下,其实使用in操作符的话,后面其实是接的多行结果那种格式的,观察下面两种情况。
【a】
select regexp_replace('.2018级5年制.,.2018级4年制.', '[.]', '''') from dual
【b】
select regexp_substr('2018级3年制,2018级4年制', '[^,]+', 1, level)
from dual
connect by regexp_substr('2018级3年制,2018级4年制', '[^,]+', 1, level) is not null
对比以上两个sql,应该可以看出区别了吧。
二、 解决方法
select *
from (select f.*, f.nj || '级' || m.major_year || '年制' njyear
from v_zhxg_jf_sfxx_ys_ss_tz_jm_tf f
left join wp_kdb_major m
on f.zydm = m.major_key) t
where to_char(t.njyear) not in
(select regexp_substr('2018级3年制,2018级4年制', '[^,]+', 1, level)
from dual
connect by regexp_substr('2018级3年制,2018级4年制',
'[^,]+',
1,
level) is not null)
问题解决,在此做个总结,以防后面踩坑。