カテゴリ:

文字列とバイナリ関数 (マッチング/比較)

POSITION

2番目の引数で最初の引数が最初に出現する場所を検索し、成功した場合は、2番目の引数で最初の引数の位置(1ベース)を返します。

1番目以降に出現する場所(例えば3番目に出現する場所)を見つける必要がある場合は、 REGEXP_INSTR 関数を使用できます。

エイリアス:

CHARINDEX

CHARINDEX 関数は、 POSITION がサポートする構文バリエーションの1つをサポートしないことに注意してください。

構文

POSITION( <expr1>, <expr2> [ , <start_pos> ] )

POSITION( <expr1> IN <expr2> )
Copy

引数

必須:

expr1

検索する値を表す文字列またはバイナリ式。

expr2

検索する値を表す文字列またはバイナリ式。

オプション:

start_pos

検索を開始する位置を示す番号(1expr2 の開始を表します)。

デフォルト: 1

戻り値

この関数は NUMBER型の値を返します。

いずれかの引数が NULL の場合、関数は NULL を返します。

使用上の注意

  • 文字列またはバイナリ値が見つからない場合、関数は 0 を返します。

  • 指定されたオプションの start_pos が2番目の引数(検索する文字列)の末尾を超えている場合、関数は 0 を返します。

  • 最初の引数が空の場合(空の文字列など)、関数は 1 を返します。

  • 最初の2つの引数のデータ型は同じである必要があります(2つの文字列または2つのバイナリ値)。

照合順序の詳細

この関数は、次の照合仕様をサポートしません。

  • pi (句読点は区別しない)。

  • cs-ai (大文字と小文字は区別、アクセント記号は区別しない)。

以下の例では、 POSITION 関数を使用しています。

VARCHAR 式

「banana」で「an」の初出を見つけます。

SELECT POSITION('an', 'banana', 1);
Copy
+-----------------------------+
| POSITION('AN', 'BANANA', 1) |
|-----------------------------|
|                           2 |
+-----------------------------+

位置3以降の「banana」で「an」の初出を見つけます。この検索では、「an」の2番目の出現が見つかります。

SELECT POSITION('an', 'banana', 3);
Copy
+-----------------------------+
| POSITION('AN', 'BANANA', 3) |
|-----------------------------|
|                           4 |
+-----------------------------+

文字列でUnicode文字を含むさまざまな文字を検索します。

SELECT n, h, POSITION(n IN h) FROM pos;
Copy
+--------+---------------------+------------------+
| N      | H                   | POSITION(N IN H) |
|--------+---------------------+------------------|
|        |                     |                1 |
|        | sth                 |                1 |
| 43     | 41424344            |                5 |
| a      | NULL                |             NULL |
| dog    | catalog             |                0 |
| log    | catalog             |                5 |
| lésine | le péché, la lésine |               14 |
| nicht  | Ich weiß nicht      |               10 |
| sth    |                     |                0 |
| ☃c     | ☃a☃b☃c☃d            |                5 |
| ☃☃     | bunch of ☃☃☃☃       |               10 |
| ❄c     | ❄a☃c❄c☃             |                5 |
| NULL   | a                   |             NULL |
| NULL   | NULL                |             NULL |
+--------+---------------------+------------------+

BINARY 式

以下の値は16進表記であるため、単一の BINARY バイトは2桁の16進数として表されます。

この例では、「EF」が3番目のバイトと一致するため、戻り値は 3 です(最初のバイトは「AB」、2番目のバイトは「CD」、3番目のバイトは「EF」です)。

SELECT POSITION(X'EF', X'ABCDEF');
Copy
+----------------------------+
| POSITION(X'EF', X'ABCDEF') |
|----------------------------|
|                          3 |
+----------------------------+

この例では、一致するものはありません。シーケンス「BC」は検索対象の値に含まれているように見えますが、「B」は最初のバイトの2番目のニブルであり、「C」は2番目のバイトの最初のニブルです。実際に「BC」を含むバイトはないため、返される値は 0 です(見つかりません)。

SELECT POSITION(X'BC', X'ABCD');
Copy
+--------------------------+
| POSITION(X'BC', X'ABCD') |
|--------------------------|
|                        0 |
+--------------------------+