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

一、简介

最近在工作中,同事遇到一个问题,就是前台搜索条件传递过来 “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)

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

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值