在where子句中的列输入中拆分分隔值

时间:2016-02-15 17:17:23

标签: oracle

我需要拆分一个由Pipe分隔的列并与记录进行比较。像这样的东西

select 1 
  from T1 t1 
 where t1.date_col not between '01-JAN-2005' and '31-JAN-2005';

我需要从参考表中填充from子句值,其中数据类似于

ref_table
col_1
01-JAN-2005 | 31-JAN-2005

查询我正在努力实现

REGEXP_SUBSTR ( col_1
           , '^[^|]+') from ref_table

导致01-JAN-2005

Table T1 
 date_col 
  01-Jan-05 
  15-Jan-05 
  31-Mar-05 

Ref_table 
 col_1 
 01-JAN-2005 | 31-JAN-2005

2 个答案:

答案 0 :(得分:0)

使用参考表中的间隔加入表t1中的日期,并从原始日期集中减去结果:

  select t11.date_col
    from t1 t11
   minus
  select t12.date_col 
    from t1 t12
    join (
            select to_date ( trim ( substr(col_1, 1, instr(col_1, '|') - 1) ), 'DD-Mon-YYYY' )    d_from
                 , to_date ( trim ( substr(col_1, instr(col_1, '|') + 1) ), 'DD-Mon-YYYY' )       d_to
              from ref_table
         ) rt on (
                    rt.d_from <= t12.date_col
                AND rt.d_to   >= t12.date_col
              )
       ;

我假设您的参考表中的col_1包含成对的排除区间。

答案 1 :(得分:0)

你可以这样做:

--Sample data
with t1 as (
  select '01-Jan-05' col_1 union 
  select '15-Jan-05' union 
  select '31-Mar-05'
),
Ref_table as (
  select '01-JAN-2005 | 31-JAN-2005' col_1
)
select *
  from t1, 
       Ref_table r
 where to_date(t1.col_1, 'DD/MON/YY')
          not between to_date(trim(regexp_replace(r.col_1, '(.*)\|.*', '\1')), 'DD/MON/YY')
                  and to_date(trim(regexp_replace(r.col_1, '.*\|(.*)', '\1')), 'DD/MON/YY')

虽然你真的应该改进你的ref_table设计。存储值与一些字符分隔总是证明是一个问题。