言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

  1. トップページ
  2. SQL辞典
  3. LIKE(関数編)/ POSITION

LIKE(関数編)/ POSITION

対応: SQL-92(1992)

文字列の中から特定の部分文字列が何文字目に現れるかを返す関数です。DBMSによって関数名が異なります。

構文

『POSITION』: SQL標準の文字位置検索関数(MySQL・PostgreSQL)。

POSITION(検索文字列 IN 対象文字列)

『INSTR』: 引数の順番が逆になります(MySQL・SQLite)。

INSTR(対象文字列, 検索文字列)

『LOCATE』: InStrと同義(MySQL)。

LOCATE(検索文字列, 対象文字列 [, 開始位置])

構文一覧

関数DBMS概要
POSITION(s IN str)MySQL・PostgreSQLstrの中でsが最初に現れる文字位置を返します。見つからない場合は0を返します。
INSTR(str, s)MySQL・SQLitestrの中でsが最初に現れる文字位置を返します。引数の順番がPOSITIONと逆です。
LOCATE(s, str, pos)MySQLpos(省略可)以降でsが最初に現れる位置を返します。

サンプルコード

以下の『employees』テーブルを例に説明します。

employees email ayanami.rei@example.com ikari.shinji@example.com soryu.asuka@example.com 3 rows in set

メールアドレスに@が含まれるかを確認します。

sample_position.sql
SELECT
    email,
    POSITION('@' IN email) AS at_position
FROM employees;
+--------------------------+-------------+
| email                    | at_position |
+--------------------------+-------------+
| ayanami.rei@example.com  |          12 |
| ikari.shinji@example.com |          13 |
| soryu.asuka@example.com  |          12 |
+--------------------------+-------------+
3 rows in set

@の位置を使ってドメイン部分を取り出します。

sample_position.sql
SELECT
    email,
    SUBSTRING(
        email,
        POSITION('@' IN email) + 1
    ) AS domain
FROM employees;
+--------------------------+-------------+
| email                    | domain      |
+--------------------------+-------------+
| ayanami.rei@example.com  | example.com |
| ikari.shinji@example.com | example.com |
| soryu.asuka@example.com  | example.com |
+--------------------------+-------------+
3 rows in set

メールアドレスにドットが含まれる位置を確認します(POSITION > 0 で存在確認)。

sample_position.sql
SELECT
    email,
    POSITION('.' IN email) AS first_dot_pos
FROM employees
WHERE POSITION('.' IN email) > 0;
+--------------------------+---------------+
| email                    | first_dot_pos |
+--------------------------+---------------+
| ayanami.rei@example.com  |             8 |
| ikari.shinji@example.com |             6 |
| soryu.asuka@example.com  |             6 |
+--------------------------+---------------+
3 rows in set

データベース別の書き方

MySQL / MariaDB

『POSITION』『INSTR』『LOCATE』の3種類が使用できます。

SELECT email, POSITION('@' IN email) AS at_position FROM employees;
SELECT email, INSTR(email, '@') AS at_position FROM employees;

PostgreSQL

PostgreSQL では『POSITION』が使用できます(SQL標準構文)。

SELECT email, POSITION('@' IN email) AS at_position FROM employees;

SQLite

SQLite では『INSTR』が使用できます(引数順はMySQL・SQLiteで同じ「対象文字列, 検索文字列」)。

SELECT email, INSTR(email, '@') AS at_position FROM employees;

概要

『POSITION』は文字位置を1始まりで返します。検索文字列が見つからない場合は0を返すため、「0より大きいかどうか」で存在チェックができます。

MySQL では『POSITION』と『INSTR』の両方が使えますが、引数の順番が逆です。POSITION は「検索文字列 IN 対象文字列」、INSTR は「対象文字列, 検索文字列」の順です。混同しやすいため注意してください。

取り出した位置情報は『SUBSTRING』と組み合わせることで、特定パターンに基づいた部分文字列の抽出が柔軟にできます。文字列の置換は『UPPER / LOWER / REPLACE』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。