UPPER / LOWER / REPLACE
| 対応: | SQL-92(1992) |
|---|
文字列を大文字・小文字に変換したり、特定の文字列を別の文字列に置き換えるための関数です。データの正規化やクレンジングによく使われます。
構文
『UPPER』: 文字列をすべて大文字に変換します。
UPPER(str) UCASE(str) -- MySQLでの別名
『LOWER』: 文字列をすべて小文字に変換します。
LOWER(str) LCASE(str) -- MySQLでの別名
『REPLACE』: 文字列内の指定した部分を別の文字列に置き換えます。
REPLACE(str, from_str, to_str)
構文一覧
| 関数 | 概要 |
|---|---|
| UPPER(s) | 文字列内のアルファベットをすべて大文字に変換します。日本語には影響しません。 |
| LOWER(s) | 文字列内のアルファベットをすべて小文字に変換します。日本語には影響しません。 |
| REPLACE(s, from, to) | 文字列s内の検索文字列をすべて置換文字列に置き換えます。大文字小文字を区別します(MySQLは照合順序依存)。 |
サンプルコード
以下の『customers』テーブルを例に説明します。
メールアドレスを小文字に正規化して重複を検出します。
sample_upper_lower_replace.sql
SELECT
LOWER(email) AS normalized_email,
COUNT(*) AS count
FROM customers
GROUP BY LOWER(email)
HAVING COUNT(*) > 1;
+------------------------+-------+ | normalized_email | count | +------------------------+-------+ | ayanami.rei@example.com| 2 | +------------------------+-------+ 1 row in set
メールアドレスを大文字に変換して表示します。
sample_upper_lower_replace.sql
SELECT
email,
UPPER(email) AS upper_email
FROM customers;
+------------------------+------------------------+ | email | upper_email | +------------------------+------------------------+ | Ayanami.Rei@Example.com| AYANAMI.REI@EXAMPLE.COM| | ayanami.rei@example.com| AYANAMI.REI@EXAMPLE.COM| | SHINJI@EXAMPLE.COM | SHINJI@EXAMPLE.COM | +------------------------+------------------------+ 3 rows in set
旧ドメインを新ドメインに一括置き換えします。
sample_upper_lower_replace.sql
UPDATE employees SET email = REPLACE(email, 'old-company.com', 'new-company.com') WHERE email LIKE '%@old-company.com';
Query OK, 5 rows affected (0.02 sec) Rows matched: 5 Changed: 5 Warnings: 0
SELECT email FROM employees WHERE email LIKE '%@new-company.com';
+------------------------------+ | email | +------------------------------+ | rei@new-company.com | | shinji@new-company.com | | asuka@new-company.com | | misato@new-company.com | | kaworu@new-company.com | +------------------------------+ 5 rows in set
大文字小文字が混在するドメインを正規化します。
sample_upper_lower_replace.sql
UPDATE customers SET email = REPLACE(email, 'Example.com', 'example.com') WHERE email LIKE '%Example.com';
Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0
SELECT email FROM customers;
+-------------------------+ | email | +-------------------------+ | Ayanami.Rei@example.com | | ayanami.rei@example.com | | SHINJI@EXAMPLE.COM | +-------------------------+ 3 rows in set
データベース別の書き方
MySQL / MariaDB
『UPPER』『LOWER』『REPLACE』が使用できます。MySQL独自の別名として『UCASE』『LCASE』もありますが、移植性を考慮する場合は『UPPER』『LOWER』を使ってください。
SELECT UPPER(email), LOWER(email) FROM customers; SELECT REPLACE(email, 'Example.com', 'example.com') FROM customers;
PostgreSQL
『UPPER』『LOWER』『REPLACE』は MySQL と共通して使用できます。
SELECT UPPER(email), LOWER(email) FROM customers; SELECT REPLACE(email, 'Example.com', 'example.com') FROM customers;
SQLite
『UPPER』『LOWER』『REPLACE』は SQLite でも使用できます。ただし SQLite の『UPPER』『LOWER』はASCIIのアルファベットのみに対応しており、マルチバイト文字には効果がありません。
SELECT UPPER(email), LOWER(email) FROM customers; SELECT REPLACE(email, 'Example.com', 'example.com') FROM customers;
概要
『UPPER』と『LOWER』はアルファベットの大文字小文字を変換しますが、日本語には影響しません。大文字小文字を区別せずに検索するには、WHERE句で UPPER または LOWER を使って正規化してから比較するか、データベースの照合順序(COLLATION)を大文字小文字区別なし(case-insensitive)に設定する方法があります。
『REPLACE』は検索文字列のすべての出現箇所を置き換えます。MySQLのREPLACEは照合順序によって大文字小文字を区別するかどうかが変わります。バイナリ照合順序では厳密に一致する文字列だけを置き換えます。
文字列の結合・長さ取得は『CONCAT / LENGTH』を、部分文字列の取り出し・空白除去は『SUBSTRING / TRIM』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。