指定された部分文字列を返す汎用 SQL 関数です。
Synopsis
$PIECE(plist,delimiter[,from[,to]])
引数
plist 部分文字列を返すターゲット文字列。
delimiter 部分文字列の識別に使用する区切り文字。
from オプション — ターゲット文字列から返す部分文字列または部分文字列の範囲の先頭を指定する整数。部分文字列は、delimiter で区切り 1 から始めます。省略すると、最初の部分文字列が返されます。
to オプション — ターゲット文字列から返す部分文字列の範囲の最終部分文字列を指定する整数。from とともに使用する必要があります。
概要
$PIECE は、指定された部分文字列 (断片) を plist から返します。返される部分文字列は、使用するパラメータによって異なります。
引数
plist
部分文字列を返すターゲット文字列です。文字列リテラル、変数名、または文字列として評価される任意の有効な式を指定できます。
通常、ターゲット文字列には、区切り文字として使用される文字 (または文字列) が含まれます。この文字または文字列は、plist 内でデータ値として使用することはできません。
ターゲット文字列として NULL 文字列 (NULL) を指定した場合、$PIECE は <null>、つまり NULL 文字列を返します。
delimiter
plist 内の部分文字列を区切るために使用する検索文字列です。(引用符で囲まれた) 数値または文字列リテラル、変数名、あるいは文字列として評価される式を指定できます。
通常、区切り文字には、文字列データ内で決して使用されることがなく、部分文字列を区切る文字としてのみ使用する特定の文字を設定します。区切り文字には、複数文字からなる検索文字列を指定することもできますが、それを構成する個々の文字は文字列データ内で使用できます。
区切り文字として NULL 文字列 (NULL) を指定した場合、$PIECE は <null>、つまり NULL 文字列を返します。
from
plist 内の部分文字列の番号で、1 から始まります。これは正の整数、整数変数の名前、または正の整数として評価される式でなければなりません。部分文字列は区切り文字で区切ります。
from パラメータが to パラメータとともに使用される場合、from パラメータは文字列として返される部分文字列の範囲の先頭を指定し、to の値よりも小さくなければなりません。
to
from パラメータによって先頭が指定された範囲を終了する、plist 内の部分文字列の番号です。返される文字列には、from の位置の部分文字列と to の位置の部分文字列に加えて、その両者の間の部分文字列とそれらを区切る区切り文字が含まれます。to 引数は、正の整数、整数変数の名前、または正の整数に評価される式でなければなりません。to パラメータは必ず from とともに使用し、from の値よりも大きな値にする必要があります。
以下の例は、"," 区切り文字で識別された最初の部分文字列である 'Red' を返します。
SELECT DISTINCT $PIECE('Red,Green,Blue,Yellow,Orange,Black',',')
FROM Sample.Person
以下の例は、"," 区切り文字で識別された 3 番目の部分文字列である 'Blue' を返します。
SELECT DISTINCT $PIECE('Red,Green,Blue,Yellow,Orange,Black',',',3)
FROM Sample.Person
以下の例は、colorlist の 3 番目から 5 番目の要素である 'Blue,Yellow,Orange' を、"," で区切って返します。
SELECT DISTINCT 
$PIECE('Red,Green,Blue,Yellow,Orange,Black',',',3,5)
FROM Sample.Person
以下の $PIECE 関数はどちらも '123' を返します。これは、from が 1 のとき、引数が 2 つの形式と 3 つの形式が同等であることを示しています。
SELECT DISTINCT $PIECE('123#456#789','#') AS TwoArg
FROM Sample.Person
SELECT DISTINCT $PIECE('123#456#789','#',1) AS ThreeArg
FROM Sample.Person
以下の例は、複数文字の区切り文字列 '#-#' を使用して、3 番目の部分文字列 '789' を返します。この場合、区切り文字列を構成する個々の文字の '#' と '-' はデータ値として使用でき、指定された文字シーケンス (#-#) のみが区切り文字列として認識されます。
SELECT DISTINCT
$PIECE('1#2-3#-#45##6#-#789','#-#',3)
FROM Sample.Person
以下の例は 'MARCH;APR;MAY' を返します。これは 3 番目から 5 番目の部分文字列で構成され、delimiter ';' で区別されています。
SELECT DISTINCT
$PIECE('JAN;FEB;MARCH;APR;MAY;JUN',';',3,5)
FROM Sample.Person
以下の例は、"A,B" を返します。これは、$PIECE を入れ子にできることを示しています。曲折アクセント記号 (^) で区切られた nestlist の 2 番目の部分を探し、次にコンマ (,) で区切られた部分文字列 "A,B,C" の最初と 2 番目の部分を探します。
メモ
データ値をアンパックする $PIECE の使用法
$PIECE は、通常、区切り文字で区切られた複数のフィールドを含むデータ値を "アンパック" するために使用されます。一般的な区切り文字には、スラッシュ (/)、コンマ (,)、スペース ( )、およびセミコロン (;) があります。以下の例の値は、$PIECE の使用を示した良い例です。
'John Jones/29 River St./Boston MA, 02095'
'Mumps;Measles;Chicken Pox;Diptheria'
'45.23,52.76,89.05,48.27'
$PIECE および $LENGTH
2 つの引数の $LENGTH は、区切り文字に基づいて、文字列の部分文字列数を返します。$LENGTH を使用して文字列の部分文字列数を調べ、$PIECE を使用して個々の部分文字列を抽出します。
$PIECE および $LIST
$PIECE 関数と $LIST 関数によって使用されるデータ格納方法には互換性がなく、組み合わせて使用することはできません。例えば、$LISTBUILD を使用して作成されたリストに対して $PIECE を使用すると、予測できない結果を生じる可能性があり、これは避けるべきです。このことは、SQL 関数および対応する Caché ObjectScript 関数の両方に当てはまります。
$LIST 関数は、特定の区切り文字を使用せずに部分文字列を指定します。区切り文字または区切り文字シーケンスの設定が特定のデータ型 (ビット文字列データなど) に対して不適切な場合は、$LISTBUILD$LIST SQL 関数を使用して部分文字列の格納と検索を行ってください。
NULL 値
$PIECE は、値が NULL 文字列 (NULL) の部分文字列と、存在しない部分文字列を区別しません。両方とも、<null>、つまり NULL 文字列値が返されます。例えば、以下の 2 つの例は、from 値の 7 に対して、ともに NULL 文字列値を返します。
SELECT DISTINCT $PIECE('Red,Green,Blue,Yellow,Orange,Black',',',7)
FROM Sample.Person
SELECT DISTINCT $PIECE('Red,Green,Blue,Yellow,Orange,Black,',',',7)
FROM Sample.Person
最初の例では、7 番目の文字列がないので、NULL 文字列が返されます。2 番目の例では、plist 文字列の最後に区切り文字で示された 7 番目の文字列があり、この 7 番目の部分文字列の値が NULL 文字列です。
以下の例は、plist 内に NULL 値がある場合を示しています。これは部分文字列 3 を抽出します。この部分文字列は存在しますが、NULL 文字列です。
SELECT DISTINCT $PIECE('Red,Green,,Blue,Yellow,Orange,Black,',',',3)
FROM Sample.Person
以下の例も、NULL 文字列を返します。指定された部分文字列が存在しないためです。
SELECT DISTINCT $PIECE('Red,Green,,Blue,Yellow,Orange,Black,',',',0)
FROM Sample.Person
SELECT DISTINCT $PIECE('Red,Green,,Blue,Yellow,Orange,Black,',',',8,20)
FROM Sample.Person
以下の例では、plist 文字列内に delimiter が使用されていないため、$PIECE 関数は plist 文字列全体を返します。
SELECT DISTINCT $PIECE('Red,Green,Blue,Yellow,Orange,Black,','#')
FROM Sample.Person
入れ子になった $PIECE 操作
複雑な抽出を実行するために、$PIECE 参照を入れ子にすることができます。内側の $PIECE で返された部分文字列が外側の $PIECE の操作対象になります。各 $PIECE はそれぞれの区切り文字を使用します。例えば、以下の例は、州の省略形の 'MA' を返します。
SELECT DISTINCT 
$PIECE($PIECE('John Jones/29 River St./Boston MA 02095','/',3),' ',2)
FROM Sample.Person
以下は、入れ子になった $PIECE 操作のもう 1 つの例で、区切り文字の階層が使用されています。最初に、内側の $PIECE が曲折アクセント記号 (^) の区切り文字を使用して、文字列の 2 番目の部分文字列である 'A,B,C' を探します。次に、外側の $PIECE がコンマ (,) 区切り文字を使用して、部分文字列 'A,B,C' の最初と 2 番目の部分文字列 ('A,B') を返します。
SELECT DISTINCT
$PIECE($PIECE('1,2,3^A,B,C^@#!','^',2),',',1,2)
FROM Sample.Person
関連項目