2017-03-22 303 views
0

我有两个数字范围[1,100]和[50,200]:PL/SQL:给出两个数字范围,如何检测包含或交集?

1  100 
50  200 
  • 这是一个交叉点

另一种情况:与所述范围[40,100]和[10,200]

40  100 
10  200 
  • 这是一个包含

如何编写检测包含/交集的SQL查询(或PL:SQL过程)。

我试过使用减去但它并不适用于所有情况。

EDIT 1

的范围传递给过程为表中的行。

+0

如何范围的传递?作为四个参数?作为表中的行? – Boneist

+0

表中的行 – Sherlock

+0

也许你最好更新你的问题来给出你的表的准确表示。例如,是否只有两行?可以有两个以上的行吗?如果是这样,你想比较给定集的行(例如,每个ID可以有多个范围,并且你想比较这些范围)? – Boneist

回答

1

这里有一种方法:

WITH sd AS (SELECT start_range, 
        end_range, 
        row_number() OVER (ORDER BY start_range, end_range) rn 
      FROM sample_data) 
SELECT sd1.*, 
     sd2.*, 
     CASE WHEN sd1.start_range >= sd2.start_range AND sd1.end_range <= sd2.end_range THEN 'INCLUSION' 
      WHEN sd2.start_range >= sd1.start_range AND sd2.end_range <= sd1.end_range THEN 'INCLUSION' 
      WHEN sd1.start_range <= sd2.end_range AND sd1.end_range >= sd2.start_range THEN 'INTERSECTION' 
      ELSE 'NONE' 
     END range_overlap_type 
FROM sd sd1 
     INNER JOIN sd sd2 ON sd1.rn = 1 AND sd2.rn = 2; 
0
with source1 as 
(select 60 f, 100 s 
    from dual 
    union 
    select 50 f, 200 s from dual), 
t as 
(select source1.*, rownum rn from source1) 
select case 
     /*(1, 100), (50, 90)*/ 
     when t1.f <= t2.f and t1.s >= t2.s then 
      'Inclusion' 
     /*(1, 100), (50, 150)*/ 
     when t1.f <= t2.f and t1.s < t2.s then 
      'Intersection' 
     end result 
    from (select * from t where rn = 1) t1, (select * from t where rn = 2) t2 

我已经给出了可能的两种情况评论

相关问题