SUBSTRING / TRIM
| 対応: | SQL-92(1992) |
|---|
文字列から指定した位置・長さの部分を取り出したり、前後の空白や特定文字を除去するための関数です。データのクレンジングや加工によく使われます。
構文
『SUBSTRING』: 指定した位置から指定した長さの文字列を取り出します。
SUBSTRING(文字列, 開始位置, 長さ) SUBSTR(文字列, 開始位置, 長さ) -- 短縮形
『LEFT』 / 『RIGHT』: 左端・右端からN文字を取り出します。
LEFT(文字列, N) RIGHT(文字列, N)
『TRIM』: 前後の空白や指定文字を除去します。
TRIM(文字列) TRIM(LEADING '文字' FROM 文字列) -- 先頭のみ除去 TRIM(TRAILING '文字' FROM 文字列) -- 末尾のみ除去 TRIM(BOTH '文字' FROM 文字列) -- 両端から除去
『LTRIM』 / 『RTRIM』: 左端・右端の空白を除去します。
LTRIM(文字列) RTRIM(文字列)
構文一覧
| 関数 | 概要 |
|---|---|
| SUBSTRING(s, pos, len) | posは1始まりです。lenを省略すると末尾まで返します。 |
| LEFT(s, n) | 文字列の左端からn文字を返します。 |
| RIGHT(s, n) | 文字列の右端からn文字を返します。 |
| TRIM(s) | 文字列の前後の空白を除去します。 |
| LTRIM(s) | 文字列の左端(先頭)の空白を除去します。 |
| RTRIM(s) | 文字列の右端(末尾)の空白を除去します。 |
サンプルコード
以下の『employees』テーブルを例に説明します。
メールアドレスから@より前のユーザー名を取り出します。
sample_substring_trim.sql
SELECT
email,
SUBSTRING(
email,
1,
POSITION('@' IN email) - 1
) AS username
FROM employees;
+--------------------------+--------------+ | email | username | +--------------------------+--------------+ | ayanami.rei@example.com | ayanami.rei | | ikari.shinji@example.com | ikari.shinji | | soryu.asuka@example.com | soryu.asuka | +--------------------------+--------------+ 3 rows in set
メールアドレスの@より後のドメイン部分を取り出します。
sample_substring_trim.sql
SELECT
email,
RIGHT(
email,
CHAR_LENGTH(email) - POSITION('@' IN email)
) 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
入力データの前後空白を除去してクレンジングします。
sample_substring_trim.sql
UPDATE employees SET email = TRIM(email) WHERE TRIM(email) <> email;
Query OK, 2 rows affected Rows matched: 2 Changed: 2 Warnings: 0
SELECT email FROM employees;
+--------------------------+ | email | +--------------------------+ | ayanami.rei@example.com | | ikari.shinji@example.com | | soryu.asuka@example.com | +--------------------------+ 3 rows in set
メールアドレスのローカル部(@より前)の先頭3文字を取り出します。
sample_substring_trim.sql
SELECT
email,
LEFT(email, 3) AS local_prefix
FROM employees;
+--------------------------+--------------+ | email | local_prefix | +--------------------------+--------------+ | ayanami.rei@example.com | aya | | ikari.shinji@example.com | ika | | soryu.asuka@example.com | sor | +--------------------------+--------------+ 3 rows in set
データベース別の書き方
MySQL / MariaDB
『SUBSTRING』と『SUBSTR』の両方が使用できます。『LEFT』『RIGHT』『LTRIM』『RTRIM』も利用可能です。
SELECT SUBSTRING(email, 1, POSITION('@' IN email) - 1) AS username
FROM employees;
SELECT LEFT(email, 3) AS local_prefix FROM employees;
PostgreSQL
『SUBSTRING』と『LEFT』『RIGHT』が使用できます。『TRIM』『LTRIM』『RTRIM』も共通で利用可能です。
SELECT SUBSTRING(email FROM 1 FOR POSITION('@' IN email) - 1) AS username
FROM employees;
SELECT LEFT(email, 3) AS local_prefix FROM employees;
SQLite
SQLite では『SUBSTR』と『SUBSTRING』の両方に対応しています。『LEFT』『RIGHT』は使用できないため、『SUBSTR』で代用します。
SELECT SUBSTR(email, 1, INSTR(email, '@') - 1) AS username FROM employees; SELECT SUBSTR(email, 1, 3) AS local_prefix FROM employees;
概要
『SUBSTRING』の開始位置は1始まりです(配列の0始まりとは異なります)。開始位置に0を指定すると1と同じ扱いになるDBMSもありますが、明示的に1から指定する習慣をつけてください。
『TRIM』はデフォルトで前後の空白(スペース)を除去しますが、除去する文字を指定することもできます。全角スペースは TRIM の対象外です。全角スペースを除去するには REPLACE を使って明示的に空文字に置き換えてください。
文字列の結合・長さ取得は『CONCAT / LENGTH』を、文字列の置換・大文字小文字変換は『UPPER / LOWER / REPLACE』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。