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