データベースを扱っていると、余計なスペース(空白文字)が入ってしまうことってよくありますよね。
「 田中 太郎 」のように前後に空白があったり、「山田 花子」のように名前の間に余分なスペースが入っていたり。こういった不要な空白は、データの検索や比較をするときに問題を引き起こすんです。
でも安心してください。SQLには、こうしたスペースを簡単に削除できる便利な関数が用意されています。
この記事では、SQLでスペースを削除する様々な方法を、基本から応用まで分かりやすく解説していきます。データベースごとの違いも説明するので、あなたが使っている環境に合わせて活用できますよ。
SQLのスペース削除関数|基本の3つを理解しよう

SQLでスペースを削除するには、主に3つの関数を使います。
TRIM関数:前後の空白を削除
TRIM関数は、文字列の先頭と末尾にある空白を取り除く関数です。
基本的な構文:
TRIM(文字列)
使用例:
SELECT TRIM(' こんにちは ') AS result;
-- 結果: 'こんにちは'
前後のスペースだけが削除されて、文字列の中間にあるスペースはそのまま残りますね。
実際のテーブルで使う場合:
SELECT
name,
TRIM(name) AS trimmed_name
FROM
users;
これで、users テーブルの name カラムから前後の空白を取り除いた結果が得られます。
LTRIM関数:左側(先頭)の空白を削除
LTRIM関数は、文字列の左側(先頭)にある空白だけを削除します。
基本的な構文:
LTRIM(文字列)
使用例:
SELECT LTRIM(' データベース') AS result;
-- 結果: 'データベース'
右側(末尾)の空白は残したいけど、左側だけ削除したいときに便利ですよ。
RTRIM関数:右側(末尾)の空白を削除
RTRIM関数は、文字列の右側(末尾)にある空白だけを削除します。
基本的な構文:
RTRIM(文字列)
使用例:
SELECT RTRIM('プログラミング ') AS result;
-- 結果: 'プログラミング'
左側の空白は残したまま、右側だけきれいにできるんですね。
文字列の途中の空白も削除する方法
TRIM関数では、文字列の中にあるスペースは削除されません。すべてのスペースを取り除きたいときは、別の方法が必要です。
REPLACE関数で全スペース削除
REPLACE関数を使えば、文字列内のすべての空白を削除できます。
基本的な構文:
REPLACE(文字列, '置き換える文字', '置き換え後の文字')
全スペース削除の例:
SELECT REPLACE('山 田 太 郎', ' ', '') AS result;
-- 結果: '山田太郎'
スペースを空文字(”)に置き換えることで、すべてのスペースが消えますね。
実際のデータ更新例:
UPDATE users
SET name = REPLACE(name, ' ', '')
WHERE name LIKE '% %';
これで、name カラムに含まれるすべてのスペースを削除できます。
TRIMとREPLACEの組み合わせ
より確実にスペースを削除したい場合は、両方を組み合わせましょう。
SELECT
TRIM(REPLACE(name, ' ', '')) AS cleaned_name
FROM
users;
処理の流れ:
- REPLACE で文字列内のすべてのスペースを削除
- TRIM で前後の空白を削除(念のため)
この順番で処理すれば、どんな空白も確実に取り除けますよ。
全角スペースの削除方法
日本語のデータを扱う場合、全角スペース( )が入っていることもあります。
全角スペースと半角スペースの違い
- 半角スペース: ‘ ‘(キーボードのスペースキー)
- 全角スペース: ‘ ’(日本語入力モードでのスペース)
見た目は似ていますが、文字コードが違うので別の文字として扱われるんですね。
全角スペースを削除する方法
SELECT REPLACE(name, ' ', '') AS result
FROM users;
全角スペースを指定して削除します。
半角と全角の両方を削除
両方のスペースが混在している場合は、REPLACE を2回使いましょう。
SELECT
REPLACE(REPLACE(name, ' ', ''), ' ', '') AS cleaned_name
FROM
users;
処理の流れ:
- 内側のREPLACEで半角スペースを削除
- 外側のREPLACEで全角スペースを削除
これで、どちらのスペースも確実に取り除けます。
データベース別の実装方法
主要なデータベースシステムごとに、スペース削除の方法を見ていきましょう。
MySQL・MariaDBの場合
MySQLでは、標準的なTRIM、LTRIM、RTRIM、REPLACE関数がすべて使えます。
基本的な例:
-- 前後の空白削除
SELECT TRIM(column_name) FROM table_name;
-- すべての空白削除
SELECT REPLACE(column_name, ' ', '') FROM table_name;
-- 複数のスペースを1つに統合
SELECT TRIM(REGEXP_REPLACE(column_name, ' +', ' ')) FROM table_name;
MySQL 8.0以降では、REGEXP_REPLACE関数も使えるようになりました。
PostgreSQLの場合
PostgreSQLでも基本関数は同じですが、より高度な機能も使えます。
基本的な例:
-- 前後の空白削除
SELECT TRIM(column_name) FROM table_name;
-- 正規表現で複数スペースを削除
SELECT REGEXP_REPLACE(column_name, '\s+', '', 'g') FROM table_name;
‘\s+’ は「1つ以上の空白文字」を意味する正規表現です。
‘g’ は「すべてマッチした箇所を置換」という意味ですね。
特殊な空白文字も削除:
SELECT REGEXP_REPLACE(column_name, '[\s\u00A0]+', '', 'g') FROM table_name;
これで、通常のスペース、タブ、改行、改ページなど、あらゆる空白文字を削除できますよ。
SQL Serverの場合
SQL Serverでは、基本的な関数に加えて独自の書き方もあります。
基本的な例:
-- 前後の空白削除
SELECT TRIM(column_name) FROM table_name;
-- 左右個別に削除
SELECT LTRIM(RTRIM(column_name)) FROM table_name;
-- すべての空白削除
SELECT REPLACE(column_name, ' ', '') FROM table_name;
注意点: SQL Server 2017より前のバージョンでは、TRIM関数が使えません。
古いバージョンでは LTRIM と RTRIM を組み合わせて使いましょう。
Oracleの場合
Oracleでも標準的な関数が使えますが、少し書き方が違う場合があります。
基本的な例:
-- 前後の空白削除
SELECT TRIM(column_name) FROM table_name;
-- TRIMの詳細指定
SELECT TRIM(BOTH ' ' FROM column_name) FROM table_name;
SELECT TRIM(LEADING ' ' FROM column_name) FROM table_name; -- 先頭のみ
SELECT TRIM(TRAILING ' ' FROM column_name) FROM table_name; -- 末尾のみ
-- すべての空白削除
SELECT REPLACE(column_name, ' ', '') FROM table_name;
Oracleでは、TRIM関数で削除する文字を明示的に指定できるんですね。
実践的な使用例

実際の業務でよくあるケースごとに、具体的な使い方を見ていきましょう。
データのクリーニング
データベースに登録されているデータを一括でクリーニングする例です。
-- 顧客名の前後の空白を削除
UPDATE customers
SET customer_name = TRIM(customer_name)
WHERE customer_name LIKE ' %' OR customer_name LIKE '% ';
WHERE句で空白があるデータだけを対象にすることで、処理を効率化できます。
検索時のスペース対策
検索するときに、スペースの有無で検索結果が変わらないようにする例です。
-- ユーザー入力値からスペースを削除して検索
SELECT *
FROM products
WHERE REPLACE(product_name, ' ', '') = REPLACE('スマート フォン', ' ', '');
両方からスペースを削除してから比較すれば、確実に一致させられますね。
データ挿入時の自動クリーニング
新しいデータを挿入するときに、自動的にスペースを削除する例です。
INSERT INTO users (name, email)
VALUES (
TRIM(' 山田太郎 '),
TRIM('yamada@example.com ')
);
最初からきれいなデータを保存しておけば、後で困ることがありません。
複数の空白を1つにまとめる
文字列の途中にある連続した空白を、1つのスペースにまとめる例です。
MySQL 8.0以降:
SELECT REGEXP_REPLACE(address, ' +', ' ') AS cleaned_address
FROM customers;
PostgreSQL:
SELECT REGEXP_REPLACE(address, '\s+', ' ', 'g') AS cleaned_address
FROM customers;
「東京都 渋谷区」が「東京都 渋谷区」になりますよ。
パフォーマンスを考慮した実装
大量のデータを処理する場合は、パフォーマンスも重要です。
インデックスへの影響
TRIM や REPLACE 関数をWHERE句で使うと、インデックスが使われなくなる可能性があります。
非効率な例:
SELECT * FROM users
WHERE TRIM(name) = '山田太郎';
この場合、name カラムにインデックスがあっても、フルスキャンが発生する可能性があります。
改善策:
事前にデータをクリーニングしておくか、クリーニング済みの別カラムを用意しましょう。
-- クリーニング済みカラムを追加
ALTER TABLE users ADD COLUMN name_cleaned VARCHAR(100);
-- データを一括更新
UPDATE users SET name_cleaned = TRIM(name);
-- インデックスを作成
CREATE INDEX idx_name_cleaned ON users(name_cleaned);
-- 高速に検索できる
SELECT * FROM users WHERE name_cleaned = '山田太郎';
バッチ処理での最適化
大量のデータを更新する場合は、トランザクションをうまく使いましょう。
-- トランザクション開始
BEGIN;
-- 処理対象を絞り込んで更新
UPDATE users
SET name = TRIM(name)
WHERE name LIKE ' %' OR name LIKE '% ';
-- コミット
COMMIT;
WHERE句で対象を絞ることで、無駄な処理を減らせますね。
よくあるトラブルと解決方法
スペース削除でよくあるトラブルと、その対処法をまとめました。
TRIMで削除されない空白がある
原因: 全角スペースやタブ文字など、通常のスペース以外の空白文字が入っている
解決策:
-- 様々な空白文字を削除(PostgreSQL)
SELECT REGEXP_REPLACE(column_name, '[\s\u00A0\u3000]+', '', 'g')
FROM table_name;
\u00A0 はノーブレークスペース( )
\u3000 は全角スペースです。
NULLと空文字の扱い
問題: TRIM関数は NULL を返すことがあります
SELECT TRIM(NULL); -- 結果: NULL
解決策: COALESCE関数で空文字に変換しましょう。
SELECT COALESCE(TRIM(column_name), '') AS result
FROM table_name;
これで、NULLの場合は空文字(”)が返されますよ。
データ型の問題
問題: 数値型やデータ型には TRIM が使えません
解決策: 文字列型にキャストしてから処理します。
-- MySQLの例
SELECT TRIM(CAST(number_column AS CHAR)) FROM table_name;
-- PostgreSQLの例
SELECT TRIM(CAST(number_column AS TEXT)) FROM table_name;
更新後のデータ長
問題: スペース削除後、VARCHAR の長さが変わって問題が起きる
解決策: LENGTH関数で確認してから処理しましょう。
-- 削除前後の長さを確認
SELECT
name,
LENGTH(name) AS before_length,
LENGTH(TRIM(name)) AS after_length,
LENGTH(name) - LENGTH(TRIM(name)) AS removed_spaces
FROM users;
より高度なスペース処理テクニック

さらに複雑なケースにも対応できる、高度なテクニックを紹介します。
改行やタブ文字の削除
スペースだけでなく、改行(\n)やタブ(\t)も削除したい場合があります。
MySQLの例:
SELECT
REPLACE(
REPLACE(
REPLACE(column_name, '\n', ''),
'\r', ''),
'\t', '')
FROM table_name;
PostgreSQLの例(正規表現使用):
SELECT REGEXP_REPLACE(column_name, '[\s\r\n\t]+', '', 'g')
FROM table_name;
これで、あらゆる種類の空白文字を削除できますね。
条件付きスペース削除
特定の条件のときだけスペースを削除する例です。
SELECT
CASE
WHEN LENGTH(name) - LENGTH(TRIM(name)) > 5 THEN TRIM(name)
ELSE name
END AS cleaned_name
FROM users;
前後に5文字以上のスペースがある場合だけ削除する、という処理ですね。
ユーザー定義関数の作成
頻繁に使う場合は、専用の関数を作成すると便利です。
MySQL/MariaDBの例:
DELIMITER //
CREATE FUNCTION clean_spaces(input_text VARCHAR(255))
RETURNS VARCHAR(255)
DETERMINISTIC
BEGIN
RETURN TRIM(REPLACE(REPLACE(input_text, ' ', ''), ' ', ''));
END //
DELIMITER ;
-- 使用例
SELECT clean_spaces(' 山 田 太 郎 ') AS result;
-- 結果: '山田太郎'
一度関数を作れば、何度でも簡単に呼び出せますよ。
よくある質問と回答
Q1. TRIMとLTRIM+RTRIMの違いはありますか?
A. 結果は基本的に同じですが、TRIM関数のほうがシンプルで読みやすいコードになります。
ただし、古いSQL Serverバージョンなど、TRIM関数が使えない環境では LTRIM(RTRIM(column_name)) を使う必要がありますね。
Q2. スペース削除は処理速度に影響しますか?
A. はい、大量データの場合は影響があります。特にWHERE句で使用すると、インデックスが使えなくなる可能性があるので注意しましょう。
可能であれば、データ登録時や定期的なバッチ処理でクリーニングしておくのがおすすめです。
Q3. 日本語の姓と名の間のスペースは削除すべき?
A. 用途によります。検索や比較で使う場合は削除したほうが便利ですが、表示用には残しておいたほうが読みやすい場合もあります。
別カラムで管理するのも一つの方法ですね:
ALTER TABLE users
ADD COLUMN name_display VARCHAR(100), -- 表示用(スペース有り)
ADD COLUMN name_search VARCHAR(100); -- 検索用(スペース無し)
Q4. 正規表現とREPLACE、どちらが良いですか?
A. シンプルなスペース削除なら REPLACE のほうが分かりやすく、多くのDBで動作します。
複雑なパターン(連続スペースを1つにまとめるなど)は正規表現が便利です。
Q5. UPDATEでスペースを削除すると元に戻せない?
A. その通りです。重要なデータの場合は、必ずバックアップを取ってから実行しましょう。
または、新しいカラムを作って、そこにクリーニング後のデータを入れる方法もありますよ:
-- 元データを残したまま、クリーニング版を作成
UPDATE users
SET name_cleaned = TRIM(name)
WHERE name_cleaned IS NULL;
まとめ:目的に応じた適切な方法を選ぼう
SQLでのスペース削除は、データ品質を保つための重要な処理です。
この記事のポイント:
- TRIM関数は前後の空白削除に便利
- REPLACE関数ですべてのスペースを削除できる
- 全角スペースと半角スペースは別々に処理が必要
- データベースごとに使える関数や構文が少し異なる
- WHERE句での使用はパフォーマンスに影響する
- 改行やタブなど、特殊な空白文字も考慮しよう
- 大切なデータは必ずバックアップしてから処理する
使い分けの基本:
| 用途 | おすすめの方法 |
|---|---|
| 前後の空白だけ削除 | TRIM() |
| すべてのスペース削除 | REPLACE(文字列, ‘ ‘, ”) |
| 全角・半角両方削除 | REPLACE を2回使用 |
| 複数スペースを1つに | REGEXP_REPLACE(正規表現) |
| 複雑な空白処理 | ユーザー定義関数 |
データの特性や使用環境に合わせて、最適な方法を選んでくださいね。
きれいに整形されたデータは、検索も分析もスムーズになりますよ!

コメント