メインコンテンツまでスキップ
に最終更新

LOCATE

説明​

LOCATE 関数は、文字列 str 内で部分文字列 substr が最初に現れる位置を返します(位置は 1 から数えます)。省略可能な第三引数 pos を指定した場合は、文字列 str 内のその位置から検索を開始します。MySQL と互換性があり、文字列の照合や位置の特定によく使用されます。

構文​

LOCATE(<substr>, <str> [, <pos>])

パラメータ​

パラメータ説明
<substr>検索する部分文字列。型: VARCHAR
<str>検索対象の文字列。型: VARCHAR
<pos>省略可能。検索を開始する位置(1 から数えます)。型: INT

戻り値​

str 内で substr が最初に現れる位置(1 から数えます)を表す INT 型の値を返します。

検索規則:

  • 位置は 0 ではなく 1 から数えます。
  • 最初に一致した位置を返します。
  • pos を指定した場合はその位置から検索を開始しますが、返す値は文字列の先頭を基準とした絶対位置です。
  • 大文字と小文字を区別します。

特殊なケース:

  • 一致する部分文字列がない場合は、0 を返します。
  • いずれかの引数が NULL の場合は、NULL を返します。
  • substr が空文字列の場合は、1 を返します(pos が指定され、かつ pos > 1 の場合は pos の値を返します)。
  • str が空文字列で substr が空文字列でない場合は、0 を返します。
  • pos が 1 未満の場合は、0 を返します。
  • pos が str の長さを超える場合は、0 を返します。

例​

  1. 基本的な検索
SELECT LOCATE('bar', 'foobarbar'), LOCATE('xbar', 'foobar'), LOCATE('bar', 'foobarbar', 5);
+----------------------------+--------------------------+-------------------------------+
| LOCATE('bar', 'foobarbar') | LOCATE('xbar', 'foobar') | LOCATE('bar', 'foobarbar', 5) |
+----------------------------+--------------------------+-------------------------------+
| 4 | 0 | 7 |
+----------------------------+--------------------------+-------------------------------+
  1. 文字が最初に現れる位置を検索
SELECT LOCATE('f', 'foobar'), LOCATE('r', 'foobar');
+-----------------------+-----------------------+
| LOCATE('f', 'foobar') | LOCATE('r', 'foobar') |
+-----------------------+-----------------------+
| 1 | 6 |
+-----------------------+-----------------------+
  1. 一致する部分文字列がない場合
SELECT LOCATE('xyz', 'foobar'), LOCATE('FOO', 'foobar');
+-------------------------+-------------------------+
| LOCATE('xyz', 'foobar') | LOCATE('FOO', 'foobar') |
+-------------------------+-------------------------+
| 0 | 0 |
+-------------------------+-------------------------+
  1. NULL の扱い
SELECT LOCATE(NULL, 'foobar'), LOCATE('foo', NULL), LOCATE(NULL, NULL);
+------------------------+---------------------+--------------------+
| LOCATE(NULL, 'foobar') | LOCATE('foo', NULL) | LOCATE(NULL, NULL) |
+------------------------+---------------------+--------------------+
| NULL | NULL | NULL |
+------------------------+---------------------+--------------------+
  1. 空文字列の扱い
SELECT LOCATE('', 'foobar'), LOCATE('foo', ''), LOCATE('', '');
+----------------------+-------------------+----------------+
| LOCATE('', 'foobar') | LOCATE('foo', '') | LOCATE('', '') |
+----------------------+-------------------+----------------+
| 1 | 0 | 1 |
+----------------------+-------------------+----------------+
  1. 検索開始位置の指定
SELECT LOCATE('o', 'foobar', 1), LOCATE('o', 'foobar', 2), LOCATE('o', 'foobar', 4);
+--------------------------+--------------------------+--------------------------+
| LOCATE('o', 'foobar', 1) | LOCATE('o', 'foobar', 2) | LOCATE('o', 'foobar', 4) |
+--------------------------+--------------------------+--------------------------+
| 2 | 2 | 0 |
+--------------------------+--------------------------+--------------------------+
  1. 位置引数の境界値
SELECT LOCATE('foo', 'foobar', 0), LOCATE('foo', 'foobar', -1), LOCATE('foo', 'foobar', 10);
+----------------------------+-----------------------------+-----------------------------+
| LOCATE('foo', 'foobar', 0) | LOCATE('foo', 'foobar', -1) | LOCATE('foo', 'foobar', 10) |
+----------------------------+-----------------------------+-----------------------------+
| 0 | 0 | 0 |
+----------------------------+-----------------------------+-----------------------------+
  1. UTF-8 の部分文字列検索
SELECT LOCATE('ṛì', 'ṭṛì ḍḍumai'), LOCATE('ḍḍu', 'ṭṛì ḍḍumai');
+----------------------------------------+------------------------------------------+
| LOCATE('ṛì', 'ṭṛì ḍḍumai') | LOCATE('ḍḍu', 'ṭṛì ḍḍumai') |
+----------------------------------------+------------------------------------------+
| 2 | 5 |
+----------------------------------------+------------------------------------------+
  1. 大文字と小文字の区別
SELECT LOCATE('BAR', 'foobar'), LOCATE('Bar', 'foobar'), LOCATE('bar', 'fooBAR');
+-------------------------+-------------------------+-------------------------+
| LOCATE('BAR', 'foobar') | LOCATE('Bar', 'foobar') | LOCATE('bar', 'fooBAR') |
+-------------------------+-------------------------+-------------------------+
| 0 | 0 | 0 |
+-------------------------+-------------------------+-------------------------+
  1. 位置引数を指定した空の部分文字列
SELECT LOCATE('', 'foobar', 3), LOCATE('', 'foobar', 7), LOCATE('', '', 1);
+-------------------------+-------------------------+-------------------+
| LOCATE('', 'foobar', 3) | LOCATE('', 'foobar', 7) | LOCATE('', '', 1) |
+-------------------------+-------------------------+-------------------+
| 3 | 0 | 1 |
+-------------------------+-------------------------+-------------------+