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)' , ')', ',' )
右のかっこをコンマに置き換えると、すべてが機能するはずです。
ただし、このようなプロセスは、かなり単純なプログラム コードで行う方がよいように思えます。外部関数を作成し、それで完了します。