Tracks
SQL の REPLACE() 関数は、文字列の一部を別の指定した部分文字列に置き換えることができるため、テキスト操作に便利です。多くの場合、SQL の REPLACE() 関数は、与えられたデータセット内で文字列中に出現するすべての対象部分文字列を変更するために使われます。
テキスト操作は、データの分析を効率化するためのクレンジングや変換に役立つため、SQL で重要です。本チュートリアルでは、その使い方を紹介します。
データサイエンティストやデータエンジニアを目指している場合は、データ変換における SQL 関数の基礎を理解するために DataCamp の Introduction to SQL コースを受講することをおすすめします。あわせて、テーマをさらに深掘りする前に基礎概念を復習できる SQL 文字列関数ガイドもご覧ください。
TL;DR
-
REPLACE(string, old_substring, new_substring)は1回の呼び出しで部分文字列のすべての出現箇所を置換します -
複数の部分文字列を置換するには呼び出しを連結します:
REPLACE(REPLACE(col, 'a', 'b'), 'c', 'd') -
空文字列を渡すと文字を削除できます:
REPLACE(phone, '-', '') -
いずれかの引数が
NULLの場合、その行では関数はNULLを返します -
大文字小文字の区別はデータベースと照合順序に依存します—SQL Server と MySQL はデフォルトで大小区別なし、PostgreSQL はデフォルトで大小区別あり
SQL REPLACE() 関数を理解する
SQL の REPLACE() 関数は、列内で指定した部分文字列または文字列を検索し、別の文字列に置換します。以下の例は REPLACE() 関数の基本的な使い方を示しています。関数の引数は次のとおりです。
-
string: 置換を行う元の文字列。 -
old_substring: 置換対象の部分文字列。 -
new_substring: 古い部分文字列を置き換える新しい部分文字列。
REPLACE(string, old_substring, new_substring)
テーブル内の文字列を変更するために REPLACE() 関数を使用する場合、クエリは次の構文になります。ここで:
-
column_name: 部分文字列の出現箇所を検索する列。 -
old_substring: 置換対象の部分文字列。 -
new_substring: 古い部分文字列を置き換える新しい部分文字列。
-- Select the description column from the products table,
-- replacing occurrences of 'old' with 'new'
SELECT
REPLACE(column_name, 'old_substring', 'new_substring') AS updated_column
FROM
Products;
REPLACE() の例
SQL の REPLACE() 関数は、指定した部分文字列または文字列で、すべての出現箇所を置換します。次の例では、SQL の REPLACE() 関数が description 列の値 old を new に置換しています。クエリは各行で古い文字列を新しい文字列に置き換えます。
-- Select the description column from the products table,
-- replacing occurrences of 'old' with 'new'
SELECT
REPLACE(description, 'old', 'new') AS updated_description
FROM
Products;
注: MySQL、PostgreSQL、Oracle、SQL Server の各データベースはすべて REPLACE() 関数をサポートしています。
SQL における REPLACE() のユースケース
SQL の REPLACE() 関数には、テキスト操作やデータ変換における重要なユースケースが多数あります。主なものは次のとおりです。
基本的な置換
SQL の REPLACE() 関数を使って、基本的な置換を実行できます。SQL Server データベースに次のようなテーブルがあると仮定します。
Products テーブルの例。画像: 著者作成
次の SQL クエリを使用すると、REPLACE() 関数で old のステータスを new に変更できます。
SELECT
product_id,
product_name,
price,
REPLACE(status, 'old', 'new') AS updated_status
FROM Products;
結果のテーブルは以下のようになります。

SQL REPLACE() で更新したテーブル。画像: 著者作成
複数の部分文字列の置換
複数の部分文字列を置換したい場合は、REPLACE() 関数を連結して使います。ここでは、old を outdated に、new を fresh に更新しています。
-- Chain multiple REPLACE() functions to replace 'old' with 'outdated' and 'new' with 'fresh'
SELECT
product_id,
product_name,
price,
REPLACE(REPLACE(status, 'old', 'outdated'), 'new', 'fresh') AS updated_status
FROM Products;
結果のテーブルは以下のとおりです。

複数の部分文字列で更新したテーブル。画像: 著者作成
文字の削除
3番目の引数に空文字列を渡すと、対象の文字を完全に削除できます。これは、列から句読点や余分な空白、書式文字を取り除く最も簡潔な方法です。
-- Remove dashes from phone numbers
SELECT
customer_id,
REPLACE(phone_number, '-', '') AS clean_phone
FROM Customers;
たとえば、'555-867-5309' は '5558675309' になります。同じ手法で、特殊文字、エンコード由来の不要な文字、インポートデータの不要な空白なども除去できます。
大文字小文字の扱い
REPLACE() における大文字小文字の区別は、データベースと照合順序に依存します。PostgreSQL はデフォルトで大小区別ありのため、REPLACE(col, 'Old', 'New') は 'old' に一致しません。SQL Server と MySQL は列またはデータベースの照合順序に従い、ほとんどのデフォルトインストールでは大小区別なしのため、REPLACE() は大文字小文字に関係なく一致します。
大文字小文字を区別せずに値を置換したい場合は、置換の前に UPPER() または LOWER() 関数でテキストを変換してください。この手法で値の一貫性を保てます。
-- Replace 'OLD' with 'OUTDATED', handling case sensitivity by converting to upper case
SELECT
product_id,
product_name,
price,
REPLACE(UPPER(status), 'OLD', 'OUTDATED') AS updated_status
FROM Products;

REPLACE() と UPPER() で更新したテーブル。画像: 著者作成
-- Replace 'old' with 'outdated', handling case sensitivity by converting to lowercase
SELECT
product_id,
product_name,
price,
REPLACE(LOWER(status), 'old', 'outdated') AS updated_status
FROM Products;

SQL の REPLACE() と LOWER() で更新したテーブル。画像: 著者作成
高度なテクニック
これらの手法は、単純な検索置換を超える置換処理に対応するため、REPLACE() を他の SQL 関数と組み合わせます。
動的な値での置換
REPLACE() 関数は、他の SQL 関数と組み合わせることで動的な置換にも使えます。例えば、REPLACE() を使って、別の列の値で部分文字列を置換できます。次の例では、REPLACE() 関数が各「old」という語を実際の product_name の値に置き換えています。
-- Replace 'old' with the value from product_name column
SELECT
product_id,
product_name,
price,
REPLACE(status, 'old', product_name) AS updated_status
FROM Products;

REPLACE() と動的値で更新したテーブル。画像: 著者作成
UPDATE 文での REPLACE() の使用
SQL の REPLACE() 関数は、UPDATE 文の中で機能し、1行または複数行にわたって列の値を変更できます。次のクエリは、status 列の値 old を outdated に更新します。
-- Update the status column to replace 'old' with 'outdated'
UPDATE Products
SET status = REPLACE(status, 'old', 'outdated')
WHERE status LIKE '%old%';
テーブルを別のテーブルと結合して更新するなど、より複雑なシナリオについては、SQL UPDATE with JOIN のチュートリアルを参照してください。
REPLACE() と他の文字列関数の組み合わせ
高度な手法の一つは、文字列値の置換時に CHARINDEX() や SUBSTRING() などの他の SQL 文字列関数と REPLACE() を組み合わせることです。
-- Replace part of the product name starting from the first space with 'Updated'
SELECT
product_id,
product_name,
price,
-- Extract the substring of product_name starting from the first space to the end
REPLACE(product_name, SUBSTRING(product_name, CHARINDEX(' ', product_name), LEN(product_name)), ' Updated') AS updated_product_name
FROM Products;
上記クエリの結果テーブルは次のとおりです。

REPLACE() と他の文字列関数で更新したテーブル。画像: 著者作成
NULL を 0 に置換する
次のように、COALESCE() 関数を使って、REPLACE() の前に NULL 値をフォールバックで置き換えることができます。
-- Replace NULL with 'new' in the status column
SELECT
product_id,
product_name,
price,
REPLACE(COALESCE(status, 'NULL'), 'NULL', 0) AS updated_status
FROM Products;
落とし穴: いずれかの引数が NULL の場合、他の引数が有効でも、その行の REPLACE() の戻り値は NULL になります。REPLACE() を呼び出す前に、NULL になり得る列を COALESCE() でラップしてください。後ではありません。
SQL REPLACE() 関数の実務での活用
本番クエリで REPLACE() が活躍する代表的な場面を挙げます。
-
データクレンジング: データセット内の文字列から不要な文字やスペースを削除・置換するのに
REPLACE()関数は有用です。 -
データ変換: 値のフォーマット変更や古い値の更新など、データ変換で
REPLACE()関数が使われます。 -
ユーザー入力の扱い: 特定のデータベースで受け入れられる統一基準に合わせてユーザー入力データを調整・変換する際に
REPLACE()は重要です。これによりデータベース内の一貫性が保たれます。 -
テキストの標準化: 小文字・大文字の略語表記など、文字列列内の値を標準化して統一性を確保します。
-
条件付き置換: 特定のルールに従って値を置換することで、データベース管理を容易にします。
REPLACE() のデータベース別実装
MySQL、PostgreSQL、Oracle、SQL Server の各データベースはすべて SQL の REPLACE() 関数をサポートしており、これらのデータベースでの構文は概ね同様です。
-- Replace 'old' with 'new' in the status column
SELECT
product_id,
product_name,
price,
REPLACE(status, 'old', 'new') AS updated_status
FROM Products;
REPLACE() のパフォーマンス上の考慮点とベストプラクティス
REPLACE() 関数を使用する際は、次のパフォーマンス上の考慮点とベストプラクティスに注意してください。
クエリ性能への影響
REPLACE() 関数は、特に大規模データセットを扱う場合にクエリ性能へ影響を与えることがあります。各行でテーブルの値を更新する必要があり、クエリの実行に時間がかかるためです。
インデックスに関する考慮
WHERE 句や UPDATE で REPLACE() を実行する前に、検索対象の列にインデックスを作成してください。インデックスがないと、データベースは一致を探すために全行をスキャンし、特に大きなテーブルでは高コストになります。
ボトルネックの監視と解消
クエリ性能に関する課題を解消するには、次のベストプラクティスを検討してください。
-
データベースのプロファイリングツールを使用してクエリ性能を監視し、大規模データセットを扱う際に最適化する。
-
REPLACE()で文字列値を変更する場合は、インデックスが整合するよう定期的にメンテナンスする。 -
大規模データセットを扱うときはバッチ処理を導入して、クエリ実行時間を短縮する。
データ変換に役立つその他の高度な SQL 関数を学ぶには、DataCamp の Learn SQL コースをおすすめします。Reporting in SQL コースではデータベース最適化のトピックも扱い、性能最適化の各種手法を学べます。
まとめ
REPLACE() 関数は、ほとんどの SQL データベースで必要となるテキスト置換ニーズをカバーします。NULL の挙動—任意の引数が NULL なら結果も NULL—と、大小区別が重要な場合はデータベースの照合設定を必ず確認してください。
SQL の REPLACE() 関数についてさらに学ぶには、DataCamp の Intermediate SQL および SQL Fundamentals コースを受講してください。データ変換における SQL の活用をさらに学びキャリアを加速するには、Associate Data Analyst in SQL キャリアトラックもおすすめです。最後に、SQL Associate Certification を取得して、データ分析における SQL 活用の実績を示し、面接でのアピールにつなげましょう。
また、データ分析で使われるさまざまな SQL 関数をさらに学ぶなら、以下のチュートリアルもぜひご覧ください。
よくある質問
SQL REPLACE() 関数とは何ですか?
SQL の REPLACE() 関数は、指定した部分文字列のすべての出現箇所を別の部分文字列に置換・変更します。
REPLACE() 関数は大文字小文字を区別しますか?
SQL の REPLACE() 関数は大文字小文字を区別します。大小区別しない値を扱う場合は、置換の前に UPPER または LOWER 関数で文字列を変換する必要があります。
SQL の REPLACE() 関数で複数の部分文字列を置換できますか?
複数の部分文字列を置換したい場合は、SQL で REPLACE() 関数を複数回連結して使用します。
REPLACE() 関数をサポートしている SQL データベースはどれですか?
SQL Server、Oracle、PostgreSQL、MySQL など主要なデータベースはすべて、SQL の REPLACE() 関数をサポートしています。
SQL REPLACE() 関数はクエリ性能に影響しますか?
SQL の REPLACE() 関数は、大規模データセットを扱う際にクエリ性能へ影響する場合があります。性能向上のために、クエリの最適化と適切なインデックス付けを行ってください。