2017-05-01 12 views
0

私たちのアプリケーションは、IBM iSeries - DB2データベースセットアップであるメインフレームです。いくつかのテーブル値に範囲があります。DB内の遠隔表現を照会する方法はありますか?

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

- UPDATE -

上記データは、単一の行(正確には単一の列)です。同じフォーマットでは複数の値があります(さまざまな行にあります)

この場合、個々の値は ";"で区切られますが、110:160は範囲です。これには110から160までのすべての値が含まれています。個々の値については、明らかに同じステートメントを使用していました。 Ex;もし私が105を照会しなければならない場合 私は125を問わなければなりませんでした。これは技術的にデータベースに存在しません。しかし、論理的に私はそのレコードを取得する必要があります。

システム(アプリケーション)は何とかこれを達成できましたが、わかりません。私はメインフレームの開発者ではなく、私たちが取り組んでいる自動化のための特定のレコードを取得するためにデータベースに問い合わせるだけでした。

回避策として、私は2つのことを考えることができます:

  • は範囲を拡大し、プログラムで一時データベースに格納します。 例:110:160は110; 111; 112..160に拡張されます(はい、面倒です)
  • 特定の一意の列(範囲なしのもの)をフィルタリングしてレコードの数を減らします。プログラムによって論理を適用して適切なレコードを特定する

どちらも回避策であるため、私はシステムがそれをどのように行うのか興味がありませんでした。 (私はアプリの開発者に手を差し伸べた。これまでは運がなかった)。これを達成するための直接的なアプローチはありますか?それはストアドプロシージャですか?

答えて

2

私はあなたの質問の値が1行ではなく、複数の場合は - そうでなければいくつかの前処理が行われる必要があります。 私は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 
+0

残念ながら、上記のデータは、単一の行にあります。また、答えを少し説明してもらえますか? –

+0

共通テーブル式(temp)はベーステーブル(ここではtestrange)を選択し、 '100:160'のID列を持つので、valueatカラムに値が入る前にすべてを抽出します( ':')。 'を列の値2に挿入します。ですから、最終的には、WHERE条件の間にある一時テーブルから選択することができます。単一の(範囲なし)値の場合、value1とvalue2には単一の数値だけが含まれます – MichaelTiefenbacher

+0

複数の範囲を1つの行に複数の単一値の範囲の横に入れることはできますか? – MichaelTiefenbacher

関連する問題