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・PostgreSQL | strの中でsが最初に現れる文字位置を返します。見つからない場合は0を返します。 |
| INSTR(str, s) | MySQL・SQLite | strの中でsが最初に現れる文字位置を返します。引数の順番がPOSITIONと逆です。 |
| LOCATE(s, str, pos) | MySQL | pos(省略可)以降でsが最初に現れる位置を返します。 |
サンプルコード
以下の『employees』テーブルを例に説明します。
メールアドレスに@が含まれるかを確認します。
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』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。