$EXTRACT (SQL)
構文
$EXTRACT(string[,from[,to]])
説明
$EXTRACT は string の指定した位置から部分文字列を返します。返される部分文字列の内容は、使用する引数によって決まります。
-
$EXTRACT(string) は、文字列の先頭文字を抽出します。
-
$EXTRACT(string,from) は、from で指定した位置の文字を抽出します。例えば、変数 var1 が文字列 “ABCD” を含むときは、以下のコマンドは “B” を抽出します (2 番目の文字)。
SELECT $EXTRACT('ABCD',2) AS Extracted
-
$EXTRACT(string,from,to) は、from の位置で開始し to の位置で終了する文字列の範囲を抽出します。例えば、以下のコマンドは、文字列 “1234Alabama567” から文字列 “Alabama” (つまり、5 番目の位置から 11 番目の位置までにあるすべての文字) を抽出します。
SELECT $EXTRACT('1234Alabama567',5,11) AS Extracted
この関数は、データ型 VARCHAR を返します。
引数
string
string には、変数名、数値、文字列リテラル、または任意の有効な式を指定できます。
from
from 値には、正の整数を指定する必要があります (例外は、"メモ" を参照)。小数値の場合は、小数桁が切り捨てられ、整数部分のみが使用されます。
from 値が文字列内の文字数よりも大きいときは、$EXTRACT は NULL 文字列を返します。
from が to 引数なしで指定されている場合は、その位置にある 1 文字が抽出されます。
to 引数と共に使用されている場合、from は抽出する範囲の先頭を表し、to 値よりも小さな値でなくてはなりません。from が to と等しい場合、$EXTRACT は指定した位置にある 1 文字を返します。from が to よりも大きいときは、$EXTRACT は NULL 文字列を返します。
to
to 引数は、from 引数と共に使用する必要があります。必ず正の整数を指定します。小数値の場合は、小数桁が切り捨てられ、整数部分のみが使用されます。
to の値が from の値以上である場合、$EXTRACT は指定した部分列を返します。to が文字列の長さより大きい場合、$EXTRACT は from の位置から文字列の終了までの部分文字列を返します。to が from よりも小さい場合、$EXTRACT は NULL 文字列を返します。
例
以下の例は文字列の 4 番目の文字 “S” を返します。
SELECT $EXTRACT('THIS IS A TEST',4) AS Extracted
以下の例は、先頭から 7 番目の文字までの部分文字列 “THIS IS” を返します。
SELECT $EXTRACT('THIS IS A TEST',1,7) AS Extracted
以下の例は、“ABCD” から 2 番目の文字 (“B”) を抽出します。
SELECT $EXTRACT("ABCD",2)
以下の例は、from 値が “1” のとき、1-引数形式は 2-引数形式と等しいことを示しています。両方の $EXTRACT 関数は、“H” を返します。
SELECT $EXTRACT("HELLO")
SELECT $EXTRACT("HELLO",1)
メモ
$PIECE および $LIST と比較した $EXTRACT
$EXTRACT は、文字列からの整数位置により、部分文字列を返します。$PIECE と $LIST は両方とも、特別にフォーマットされた文字列を処理します。
$PIECE は、文字列内に区切り文字が使用されている標準文字の文字列から、部分文字列を返します。
$LIST は、要素 (文字ではない) の整数位置により、エンコードされたリストから要素のサブリストを返します。$LIST は、通常の文字列に対して使用できません。また、$EXTRACT は、エンコードされたリストに対して使用できません。
$EXTRACT、$FIND、$LENGTH、および $PIECE 関数は、標準文字の文字列に対して処理を実行します。さまざまな $LIST 関数は、エンコードされた文字列を操作します。この文字列は、標準の文字列とは互換性がありません。唯一の例外は、$LISTGET 関数と、引数が 1 つおよび 2 つの形式の $LIST 関数です。これらの関数は、入力としてエンコードされた文字の文字列を受け取り、単一要素値を標準文字の文字列として出力します。
$EXTRACT と Unicode
$EXTRACT 関数は、バイトではなく、文字を操作します。したがって、以下の例で示すように、Unicode の文字列は ASCII 文字列と同様に処理されます。以下の埋め込み SQL の例では、pi ($CHAR(960)) に対して Unicode 文字を使っています。
SET a="QT PIE"
SET b=("QT "_$CHAR(960))
&sql(SELECT
$EXTRACT(:a,-33,4),
$EXTRACT(:a,4,4),
$EXTRACT(:a,4,99),
$EXTRACT(:b,-33,4),
$EXTRACT(:b,4,4),
$EXTRACT(:b,4,99)
INTO :a1,:a2,:a3,:b1,:b2,:b3)
IF SQLCODE'=0 {
WRITE !,"Error code ",SQLCODE }
ELSE {
WRITE !,"ASCII form returns ",!,a1,!,a2,!,a3
WRITE !,"Unicode form returns ",!,b1,!,b2,!,b3 }
NULL と無効な引数
-
string が NULL 文字列の場合は、NULL 文字列が返されます。
-
from が文字列の長さよりも大きい場合は、NULL 文字列が返されます。
-
from がゼロまたは負の数のときに to が指定されていない場合は、NULL 文字列が返されます。
-
to がゼロ、負の数、または from よりも小さな数の場合は、NULL 文字列が返されます。
-
to が有効な値の場合は、from はゼロまたは負の数でもかまいません。$EXTRACT は、この from 値を 1 として処理します。
無効な引数値に対して、SQLCODE エラーは生成されません。
以下の例は、負の from 値が 1 として評価されるため、$EXTRACT は先頭から 7 番目の文字までの部分文字列 “THIS IS” を返します。
SELECT $EXTRACT('THIS IS A TEST',-7,7)
以下の埋め込み SQL の例にある $EXTRACT 関数呼び出しは、すべて NULL 文字列を返します。
SET a="THIS IS A TEST"
SET b=""
&sql(SELECT
$EXTRACT(:a,33),
$EXTRACT(:a,-7),
$EXTRACT(:a,3,2),
$EXTRACT(:a,-7,0),
$EXTRACT(:a,-7,-10),
$EXTRACT(:b,-33,4),
$EXTRACT(:b,4,4),
$EXTRACT(:b,4,99),
$EXTRACT(NULL,-33,4),
$EXTRACT(NULL,4,4),
$EXTRACT(NULL,4,99)
INTO :a1,:a2,:a3,:a4,:a5,:b1,:b2,:b3,:c1,:c2,:c3)
IF SQLCODE'=0 {
WRITE !,"Error code ",SQLCODE }
ELSE {
WRITE !,"FROM too big: ",a1
WRITE !,"FROM negative, no TO: ",a2
WRITE !,"TO smaller than FROM: ",a3
WRITE !,"TO not a positive integer: ",a4,a5
WRITE !,"LIST is null string: ",b1,b2,b3,c1,c2,c3 }