Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

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

LIKE(関数編)/ POSITION

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

構文
-- POSITION: SQL標準の文字位置検索関数(MySQL・PostgreSQL)。
POSITION(検索文字列 IN 対象文字列)

-- INSTR: 引数の順番が逆になります(MySQL・Oracle)。
INSTR(対象文字列, 検索文字列)

-- CHARINDEX: SQL Serverで使います。
CHARINDEX(検索文字列, 対象文字列 [, 開始位置])

-- LOCATE: InStrと同義(MySQL)。
LOCATE(検索文字列, 対象文字列 [, 開始位置])
構文一覧
関数DBMS概要
POSITION(s IN str)MySQL・PostgreSQLstrの中でsが最初に現れる文字位置を返します。見つからない場合は0を返します。
INSTR(str, s)MySQL・Oraclestrの中でsが最初に現れる文字位置を返します。引数の順番がPOSITIONと逆です。
CHARINDEX(s, str)SQL Serverstrの中でsが最初に現れる文字位置を返します。見つからない場合は0を返します。
LOCATE(s, str, pos)MySQLpos(省略可)以降でsが最初に現れる位置を返します。
サンプルコード
-- メールアドレスに@が含まれるかを確認します。
SELECT
    メールアドレス,
    POSITION('@' IN メールアドレス) AS アットマーク位置
FROM 社員;

-- @の位置を使ってドメイン部分を取り出します。
SELECT
    メールアドレス,
    SUBSTRING(
        メールアドレス,
        POSITION('@' IN メールアドレス) + 1
    ) AS ドメイン
FROM 社員;

-- URLにプロトコルが含まれる行を取得します(POSITION > 0 で存在確認)。
SELECT URL, サイト名
FROM 外部リンク
WHERE POSITION('https://' IN URL) > 0;

-- INSTR で商品名に特定ブランド名が含まれるか確認します(MySQL)。
SELECT 商品名, 単価
FROM 商品
WHERE INSTR(商品名, 'スマート') > 0
ORDER BY 単価 DESC;
実行結果
-- メールアドレスのアットマーク位置。
メールアドレス          | アットマーク位置
------------------------+-----------------
yamada@example.com      | 7
suzuki.h@example.com    | 9
sato123@example.com     | 8

-- ドメイン部分の抽出。
メールアドレス          | ドメイン
------------------------+-------------
yamada@example.com      | example.com
suzuki.h@example.com    | example.com
データベース別の書き方

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

-- MySQL・PostgreSQL: POSITION を使います。
SELECT メールアドレス, POSITION('@' IN メールアドレス) AS 位置 FROM 社員;

Oracle では『INSTR』を使います。『INSTR』は引数の順番が POSITION と逆で、第3引数で検索開始位置、第4引数で何番目の出現を探すかを指定できます。

-- Oracle: INSTR を使います(引数順: 対象文字列, 検索文字列)。
SELECT メールアドレス, INSTR(メールアドレス, '@') AS 位置 FROM 社員;

SQL Server では『CHARINDEX』を使います。引数の順番は『POSITION』と同じく「検索文字列, 対象文字列」です。

-- SQL Server: CHARINDEX を使います。
SELECT メールアドレス, CHARINDEX('@', メールアドレス) AS 位置 FROM 社員;

SQLite では『INSTR』を使用できます(引数順は Oracle と同じ)。

概要

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

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

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

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