MySQLのLOCATE()関数はPOSITION()やINSTR()関数と何が違う?3つの文字列検索関数の違いを徹底解説
MySQLには、文字列の中から部分文字列が最初に出現する位置を返す関数として、LOCATE()、POSITION()、INSTR() の3つが用意されています。いずれも基本的な役割は同じですが、使い方や機能面でいくつか重要な違いがあります。
最大の違い:検索開始位置を指定できるのはLOCATE()だけ
3つの関数の中で最も大きな違いは、LOCATE()関数だけが第3引数で検索の開始位置を指定できるという点です。POSITION()やINSTR()にはこのような引数が存在しないため、常に文字列の先頭から検索が行われます。
そのため、「n番目以降の出現位置」を調べたい場合には、実質的にLOCATE()を使うことになります。また、後方から検索したい場合はLOCATE()をREVERSE()と組み合わせるなどの工夫が必要です。
構文(シンタックス)の違い
LOCATE()
LOCATE(部分文字列, 対象文字列[, 開始位置])
第3引数の「開始位置」は省略可能で、省略した場合は先頭から検索されます。
POSITION()
POSITION(部分文字列 IN 対象文字列)
標準SQL準拠の書き方で、引数をカンマではなく IN キーワードで区切る点が特徴的です。開始位置は指定できません。
INSTR()
INSTR(対象文字列, 部分文字列)
LOCATE()とは引数の順序が逆になっている点に注意が必要です。開始位置の指定はできません。
実行例で確認する
-- LOCATE(): 基本形(4を返す)
SELECT LOCATE('bar', 'foobarbar');
-- LOCATE(): 開始位置を5に指定(7を返す)
SELECT LOCATE('bar', 'foobarbar', 5);
-- POSITION(): 先頭からのみ検索(4を返す)
SELECT POSITION('bar' IN 'foobarbar');
-- INSTR(): 引数の順序に注意(4を返す)
SELECT INSTR('foobarbar', 'bar');
まとめ:どの関数を使えばよいか?
- 検索開始位置を指定したい場合 →
LOCATE()一択 - 標準SQL準拠の記述にしたい場合 →
POSITION()が適切 - Oracleなど他DBMSとの互換性を意識する場合 → 引数順序が同じ
INSTR()が便利
このように、3つの関数は似た用途で使えますが、「開始位置指定の可否」「引数の順序」「構文スタイル」という違いがあるため、目的に応じて使い分けることが大切です。
-
MySQLのCASE文で同じ列から条件別に値を取り出し、別々の列に表示する方法
MySQLのCASE文で同じ列から条件別に値を取り出す方法 MySQLである列(カラム)の値を複数の条件で判定し、それぞれの結果を別々の列として表示したい場合は、CASE文を使用します。CASE文を組み合わせることで、1つの列から条件に応じた異なる値を柔軟に取り出せます。 まず、サンプル用のテーブルを作成しましょう。 mysql> create table DemoTable ( Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, Name varchar
-
MySQLでテーブルの列名とデータ型を抽出する方法
MySQLでテーブルに含まれる列名(カラム名)とそのデータ型を一覧として取得したい場合は、INFORMATION_SCHEMA.COLUMNS テーブルを利用するのが便利です。この方法を使えば、SQLを1つ実行するだけで、指定したデータベース・テーブル内のすべての列の情報を簡単に抽出できます。INFORMATION_SCHEMA.COLUMNSとはINFORMATION_SCHEMA.COLUMNS は、MySQLサーバーが管理しているメタデータ(スキーマ情報)を格納するシステムビューの一つです。データベース名(table_schema)やテーブル名(table_name)、列名(column