有没有办法在DB中查询范围表达式?

时间:2017-05-01 13:03:54

标签: sql db2 db2-400

我们的应用程序是一个Mainframe,它是一个IBM iSeries - DB2数据库设置。我们的一些表值具有范围。

  

Ex:100; 105; 108; 110:160 ; 180

- 更新 -

以上数据来自单行(准确地说是单列)。在相同的格式中,将存在多个值(在各行上)

在这种情况下,单个值由“;”分隔,但110:160是范围。它包括从110到160的所有值。现在,对于个别值,我们显然使用了类似的语句。防爆;如果我要查询105。 这里的挑战是,如果我必须查询125 ,这在技术上不存在于数据库中。但是,从逻辑上讲,我需要检索该记录。

系统(应用程序)以某种方式能够实现这一点,我不知道如何。我不是大型机开发人员,我只需要查询数据库以检索我们工作的某些自动化的特定记录。

作为一种解决方法,我可以想到两件事:

  • 展开范围并以编程方式将其存储在临时数据库中。 例如:110:160将扩展到110; 111; 112..160(是的,这很乏味)
  • 通过过滤某些唯一的列(一个没有范围的列)来减少记录数,然后以编程方式应用逻辑来识别正确的记录

由于两者都是变通方法,我对系统的运作方式非常好奇。 (我伸出了app的开发者。到目前为止,没有运气)。那么有没有直接的方法来实现这一目标?它可以是存储过程吗?

1 个答案:

答案 0 :(得分:2)

如果我的问题是正确的,那么您的示例值不是单行而是多行 - 否则必须进行一些预处理。 我会使用SQL将组合值破坏到其组件中,如:

with temp(id, text, value1, value2) as (
select id, text
      ,case when posstr(id,':') > 0 
            then substr(id, 1, posstr(id,':') - 1)
            else id
       end as value1
      ,case when posstr(id,':') > 0 
            then substr(id, posstr(id,':')+1 , length(id)) 
            else id
       end as value2
from testrange
)
select * from temp 
 where 125 between value1 and value2