substring 関数 (XQuery)

$startingLoc の値で示された位置から $length の値で示された文字数分の $sourceString の値を返します。

構文

fn:substring($sourceString as xs:string?,
                          $startingLoc  as as xs:decimal?) as xs:string?

fn:substring($sourceString as xs:string?,
                          $startingLoc as xs:decimal?,
                          $length as xs:decimal?) as xs:string?

引数

  • $sourceString
    取得対象の文字列です。

  • $startingLoc
    取得対象文字列中で取得を開始する場所を示します。この値が負の値や 0 の場合、0 より後の位置にある文字のみが返されます。$sourceString の長さよりも大きい値が指定された場合は、長さ 0 の文字列が返されます。

  • $length
    [オプション] 取得する文字数です。指定されなかった場合は、$startingLoc で指定された場所以降にある文字列の文字がすべて返されます。

説明

この関数で引数を 3 つとも指定した場合、$sourceString 内で、次の範囲内の位置 $p から文字列が返されます。

fn:round($startingLoc) <= $p < fn:round($startingLoc) + fn:round($length)

$length の値は、開始位置以降の $sourceString の値の文字数よりも大きくてもかまいません。この場合、$sourceString の最後までの文字が部分文字列として返されます。

文字列の最初の文字の位置は 1 です。

$sourceString の値が空のシーケンスの場合は、長さ 0 の文字列として処理されます。$sourceString の値が空のシーケンスではなく、$startingLoc または $length のいずれかが空のシーケンスの場合は、空のシーケンスが返されます。

このトピックでは、AdventureWorks データベースのさまざまな xml 型列に格納されている XML インスタンスに対して実行される XQuery の例を紹介します。これらの各列の概要については、「AdventureWorks データベースの xml データ型表現」を参照してください。

A. XQuery の substring() 関数を使用して製品モデルの説明の概要の一部を取得する

このクエリは、製品モデルを説明するテキスト (XML ドキュメントの <Summary> 要素) から、最初の 50 文字を取得します。

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd)
SELECT ProductModelID, CatalogDescription.query('
    <Prod>{ substring(string((/pd:ProductDescription/pd:Summary)[1]), 1, 50) }</Prod>
 ') as Result
FROM Production.ProductModel
where CatalogDescription.exist('/pd:ProductDescription')  = 1

上のクエリに関して、次の点に注意してください。

  • string() 関数は、<Summary> 要素の文字列値を返します。<Summary> 要素にはテキストとサブ要素 (HTML の書式要素) の両方が含まれていますが、これらの要素を省いてテキストだけを取得するために、この関数が使われています。

  • substring() 関数は、string() 関数により取得された文字列値の最初の 50 文字を取得します。

次に結果の一部を示します。

ProductModelID Result
-------------- ----------------------------------------------------
19      <Prod>Our top-of-the-line competition mountain bike.</Prod> 
23      <Prod>Suitable for any type of riding, on or off-roa</Prod>
...

実装の制限事項

次に、制限事項を示します。

  • SQL Server では、$startingLoc および $length parameters の型が xs:double ではなく xs:decimal である必要があります。

  • SQL Server では、空のシーケンスが () にマップされる動的エラーの結果の値になる場合があるため、$startingLoc および $length の値に空のシーケンスを使用することができます。

  • Unicode UTF-16 のサロゲート ペアは、1 文字ではなく 2 文字として計算されます。