Skip to main content

This documentation is for an older version of this product. See the latest version of this content.Opens in a new tab

$EXTRACT (SQL)

文字列から、指定された位置にある文字を抽出する文字列関数です。

Synopsis

$EXTRACT(string[,from[,to]])

引数

引数 説明
string 部分文字列を抽出するターゲット文字列。
from オプション — 抽出する文字のターゲット文字列内での位置 (1 文字を抽出する場合はその文字の位置、複数文字を抽出する場合はその先頭文字の位置)。1 から始まる正の整数として指定します。
to オプション — 抽出する文字の範囲の最終位置 (その文字まで抽出)。 1 から始まる正の整数として指定します。

概要

$EXTRACTstring の指定した位置から部分文字列を返します。返される部分文字列の内容は、使用する引数によって決まります。

  • $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 文字列を返します。

fromto 引数なしで指定されている場合は、その位置にある 1 文字が抽出されます。

to 引数と共に使用されている場合、from は抽出する範囲の先頭を表し、to 値よりも小さな値でなくてはなりません。fromto と等しい場合、$EXTRACT は指定した位置にある 1 文字を返します。fromto よりも大きいときは、$EXTRACT は NULL 文字列を返します。

to

to 引数は、from 引数と共に使用する必要があります。必ず正の整数を指定します。小数値の場合は、小数桁が切り捨てられ、整数部分のみが使用されます。

to の値が from の値以上である場合、$EXTRACT は指定した部分列を返します。to が文字列の長さより大きい場合、$EXTRACTfrom の位置から文字列の終了までの部分文字列を返します。tofrom よりも小さい場合、$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

以下の埋め込み SQL 例は、a から 2 番目の文字 (“B”) を抽出して、この値を変数 y に割り当てます。

   SET a="ABCD"
   &sql(SELECT $EXTRACT(:a,2) INTO :y)
   IF SQLCODE'=0 {
     WRITE !,"Error code ",SQLCODE }
   ELSE {
     WRITE !,"The extract returns ",y }

以下の埋め込み SQL 例は、from 値が “1” のときに、引数 1 つの形式と引数 2 つの形式が、同じ結果になることを示しています。両方の $EXTRACT 関数は、“H” を返します。

   SET a="HELLO"
   &sql(SELECT $EXTRACT(:a),$EXTRACT(:a,1) INTO :b,:c)
   IF SQLCODE'=0 {
     WRITE !,"Error code ",SQLCODE }
   ELSE {
     WRITE !,"The one-arg form returns ",b
     WRITE !,"The two-arg form returns ",c }

メモ

$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 }

関連項目

FeedbackOpens in a new tab