0

DB2 for i (以前は iSeries または AS/400 と呼ばれていました) で SQL を使用して、文字列から値を抽出したいと考えています。

文字列には、区切られた key:value ペアの JSON に似たリストが含まれます。例:

("EventType":"XYZ","EffectiveDate":20131000,"ClientNo":2012020860902)

「Event Type」などのキー文字列が与えられた場合、コロン (':') の後の値 (この場合は「XYZ」) を見つけたいと考えています。ただし、キー文字列が常に「イベント タイプ」であるとは限らないことに注意してください。

4

3 に答える 3

0
SELECT  SUBSTR( str,
                INSTR(str, ':') + 1,
                INSTR(str, ',') - INSTR(str, ':') - 1
              ) AS str_result
FROM
(
        SELECT  '("EventType":"XYZ","EffectiveDate":20131000,"ClientNo":2012020860902)' str
        FROM    sysibm.sysdummy1
)  t
;
于 2013-11-08T17:28:13.920 に答える
0

INSTR() は使用できないため、DB2 on i では使用できません。ただし、POSSTR() を使用すると、文字列内の検索文字列の位置を特定できます。LENGTH() 関数は、検索文字列の長さを与えることができます。これら 2 つの値を一緒にすると、本質的にコロンの位置がわかります。

コロンの位置がわかっている場合は、次のコンマの位置を特定できます。これは、抽出する部分文字列の長さを示します。

目的の検索文字列のペア値の位置には、次を使用できます。

POSSTR(str, 'EffectiveDate') +
  LENGTH('EffectiveDate') + 2 

「+ 2」は、検索文字列の終了引用符とコロンを通過します。ペア値の最初の文字にいます。この式を「exprA」としましょう。(もちろん、検索文字列自体は、おそらくリテラル定数ではなく、ホスト変数になります。)

exprA の値を使用して、その位置から文字列全体の末尾までを抽出できます。現時点では、ペアの値の長さを知る必要はありません。次のコンマを見つけるための良い出発点を提供するために、これを参照します。そのコンマは、ペアになった値の長さを教えてくれます。

SUBSTR( str, exprA )

これを「exprB」としましょう。一番左の位置から始まる、目的のペア値を持つ中間値が得られます。これで、次のように考えることができます。

POSSTR( exprB, ',' ) - 1

これにより、抽出された部分文字列の最初のコンマが検索されます。「- 1」を使用すると、ペアの値の末尾の文字に戻り、効果的にその長さが提供されます。これを「exprC」と呼びます。これで、次のようなコードを考えることができます。

SUBSTR( exprB ,
        1 ,
        exprC
      )

exprB を生成して、位置 1 に目的のペアの値を持つ初期部分文字列を取得し、exprC を使用して長さを提供することで、そこから部分文字列を取得します。ここで、式を拡張して、混乱全体を確認する必要があります。

SELECT   SUBSTR(
                 SUBSTR( str,
                         POSSTR(str, 'EffectiveDate') +
                           LENGTH('EffectiveDate') + 2
                       ) ,
                 1 ,
                 POSSTR( SUBSTR( str,
                                 POSSTR(str, 'EffectiveDate') +
                                   LENGTH('EffectiveDate') + 2
                               ),
                         ','
                       ) - 1
               )  AS str_result

ここで必要なのは、SELECT が FROM を選択できるものです。上記のフレーズを使用できます。

FROM
(
        SELECT  '("EventType":"XYZ","EffectiveDate":20131000,"ClientNo":2012020860902)' str
        FROM    sysibm.sysdummy1
)  t
;

ただし、まだ小さな問題が 1 つあります。値のペアの例は 3 つあります。最初の 2 つは問題なく処理されますが、シリーズの最後のペアには、'exprC' を見つけるための末尾のコンマがありません。POSSTR() 関数はゼロを返します。醜い CASE 構造を混乱に追加することで処理できますが、すでに十分に複雑に見えます。末尾のコンマが存在することを確認するのが最も簡単かもしれません。サンプル値が有効な場合、最も簡単な方法は次のとおりです。

REPLACE( '("EventType":"XYZ","EffectiveDate":20131000,"ClientNo":2012020860902)' , ')', ',' )

右のかっこをコンマに置き換えると、すべてが機能するはずです。

ただし、このようなプロセスは、かなり単純なプログラム コードで行う方がよいように思えます。外部関数を作成し、それで完了します。

于 2014-03-19T09:44:48.113 に答える