Oracle 逗号分割的字符串转换为可放入in的语句

版权声明:本文为博主原创文章,未经博主允许不得转载。 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)

问题解决,在此做个总结,以防后面踩坑。

猜你喜欢

转载自blog.csdn.net/Weixiaohuai/article/details/84789139
今日推荐