SQLでデータを扱う際、カラムに余分なスペース(空白)が混入していることがあります。入力フォームからのデータ、CSVインポート、手動入力など、原因はさまざまです。このページでは TRIM・LTRIM・RTRIM・REPLACE 関数を使ったスペース削除の方法を、全角スペースへの対応やRDBMS別の注意点も含めて実例SQLで解説します。
この記事でわかること
- TRIM 関数で文字列の前後のスペースを除去する方法
- LTRIM / RTRIM で左右片側だけ除去する方法
- REPLACE で中間スペースも含めて全削除する方法
- 全角スペース( )を削除する方法
- Oracle / MySQL / PostgreSQL / SQL Server の違い
- UPDATE 文でテーブルのデータを実際に更新する手順
TRIM 関数で前後の空白を除去する(最もよく使う)
TRIM 関数は文字列の 先頭と末尾にある半角スペース を除去する標準SQL関数です。Oracle・MySQL・PostgreSQL・SQL Server(2017以降)のいずれでも使えます。
基本構文
TRIM(カラム名) TRIM(文字列リテラル)
実例SQL
-- 前後の半角スペースを除去
SELECT TRIM(' Hello World ') AS result;
-- 結果: 'Hello World'
-- カラムに適用
SELECT TRIM(name) AS trimmed_name FROM users;
-- Oracle: TRIM の LEADING / TRAILING / BOTH 指定
SELECT TRIM(LEADING ' ' FROM ' Hello ') FROM dual; -- 'Hello '
SELECT TRIM(TRAILING ' ' FROM ' Hello ') FROM dual; -- ' Hello'
SELECT TRIM(BOTH ' ' FROM ' Hello ') FROM dual; -- 'Hello'
注意:TRIM は前後のみ。中間スペースは除去しない
TRIM(‘Hello World’) の結果は ‘Hello World’ のまま(中間の空白は残ります)。中間スペースも削除したい場合は後述の REPLACE を使ってください。
TRIM(‘Hello World’) の結果は ‘Hello World’ のまま(中間の空白は残ります)。中間スペースも削除したい場合は後述の REPLACE を使ってください。
LTRIM・RTRIM で片側だけ除去する
LTRIM は左側(先頭)、RTRIM は右側(末尾)のスペースだけを除去します。主要なRDBMSで広くサポートされています。
Oracle / SQL Server
-- 左側のスペースを除去
SELECT LTRIM(' Hello ') FROM dual; -- 'Hello '
-- 右側のスペースを除去
SELECT RTRIM(' Hello ') FROM dual; -- ' Hello'
-- 組み合わせて両端を除去(TRIM と同等)
SELECT LTRIM(RTRIM(' Hello ')) FROM dual; -- 'Hello'
MySQL 8.0+
SELECT LTRIM(' Hello '); -- 'Hello '
SELECT RTRIM(' Hello '); -- ' Hello'
PostgreSQL
SELECT LTRIM(' Hello '); -- 'Hello '
SELECT RTRIM(' Hello '); -- ' Hello'
-- PostgreSQL は LTRIM/RTRIM に削除文字を指定できる
SELECT LTRIM('xxxHello', 'x'); -- 'Hello'
REPLACE で中間スペースも含めて全削除する
REPLACE(col, ‘ ‘, ”) を使うと、文字列中の すべての半角スペース を削除できます。前後だけでなく、単語間に挟まったスペースも一括で消えます。
-- すべての半角スペースを削除
SELECT REPLACE(' Hello World ', ' ', '') AS result;
-- 結果: 'HelloWorld'
-- カラムに適用
SELECT REPLACE(name, ' ', '') AS no_space_name FROM users;
注意:単語間のスペースも消える
‘Hello World’ に REPLACE を使うと ‘HelloWorld’ になります。単語間のスペースを保持したい場合は TRIM または LTRIM/RTRIM を使ってください。
‘Hello World’ に REPLACE を使うと ‘HelloWorld’ になります。単語間のスペースを保持したい場合は TRIM または LTRIM/RTRIM を使ってください。
全角スペース( )の削除
日本語環境では全角スペース(U+3000)が混入することがあります。TRIM や LTRIM/RTRIM は半角スペース(U+0020)にしか対応していないため、全角スペースは REPLACE を使って削除します。
-- 全角スペースを文字リテラルで削除 SELECT REPLACE(name, ' ', '') FROM users; -- Oracle: CHR(12288) で全角スペースを指定 SELECT REPLACE(name, CHR(12288), '') FROM users; -- 半角・全角スペースを両方削除する場合(ネスト) SELECT REPLACE(REPLACE(TRIM(name), ' ', ''), ' ', '') FROM users;
CHR(12288) とは?
CHR 関数は文字コードから文字を生成します。12288(16進数で0x3000)が全角スペースに対応します。MySQL では CHAR(12288 USING utf8mb4) と書きます。
CHR 関数は文字コードから文字を生成します。12288(16進数で0x3000)が全角スペースに対応します。MySQL では CHAR(12288 USING utf8mb4) と書きます。
RDBMS別の注意点まとめ
| RDBMS | TRIM | LTRIM / RTRIM | 全角スペース対応 |
|---|---|---|---|
| Oracle | ○(LEADING/TRAILING/BOTH 指定可) | ○ | REPLACE(col, CHR(12288), ”) |
| MySQL | ○ | ○ | REPLACE(col, ‘ ’, ”) |
| PostgreSQL | ○ | ○(削除文字指定可) | REPLACE(col, ‘ ’, ”) |
| SQL Server | ○(2017以降) | ○ | REPLACE(col, NCHAR(12288), ”) |
SQL Server 2016以前では TRIM 関数が使えません。代わりに LTRIM(RTRIM(col)) を使ってください。
UPDATE で実際にデータを更新する
SELECT で確認した後、UPDATE 文でテーブルのデータを実際に修正します。必ず WHERE 条件を付けて、更新対象を限定してから実行しましょう。
安全な UPDATE 手順
-- STEP1: 対象件数を SELECT で確認 SELECT COUNT(*) FROM users WHERE name != TRIM(name); -- STEP2: 実際の変更内容を確認 SELECT name, TRIM(name) AS trimmed FROM users WHERE name != TRIM(name); -- STEP3: UPDATE を実行 UPDATE users SET name = TRIM(name) WHERE name != TRIM(name); -- REPLACE で全スペースを削除する場合 UPDATE users SET name = REPLACE(name, ' ', '') WHERE name LIKE '% %';
本番環境では必ずバックアップ後に実行
UPDATE を実行する前に、テーブルのバックアップを取るか、トランザクションを使ってロールバックできる状態にしておきましょう。
UPDATE を実行する前に、テーブルのバックアップを取るか、トランザクションを使ってロールバックできる状態にしておきましょう。
UPDATE 文の詳しい使い方は UPDATE文でデータを更新する方法 も参考にしてください。
よくある質問
QTRIM と LTRIM/RTRIM の違いは何ですか?
ATRIM は前後両方のスペースを除去します。LTRIM は左側(先頭)のみ、RTRIM は右側(末尾)のみを除去します。両端を除去したい場合は TRIM が最もシンプルです。
Qタブ文字や改行もスペースと同様に削除できますか?
ATRIM はデフォルトで半角スペース(U+0020)のみを除去します。タブ(CHR(9))や改行(CHR(10))を削除したい場合は REPLACE を使い、それぞれを空文字に置換してください。
QWHERE 句でスペースを無視して検索するには?
ASELECT * FROM users WHERE TRIM(name) = ‘yamada’ のように WHERE 句の中で TRIM を使って比較することができます。ただしインデックスが効かなくなる場合があるため注意が必要です。
QOracle で全角スペースを削除するには?
AREPLACE(col, CHR(12288), ”) を使います。CHR(12288) が全角スペース(U+3000)に対応します。半角・全角の両方を消す場合は REPLACE(REPLACE(TRIM(col), ‘ ‘, ”), CHR(12288), ”) とネストします。
QREPLACE で特定のカラムのスペースだけ削除できますか?
Aはい、UPDATE users SET name = REPLACE(name, ‘ ‘, ”) WHERE id = 10 のように WHERE 句で対象行を絞り込んで更新できます。条件なしの UPDATE は全行が更新されるため要注意です。
まとめ
SQLでスペースを削除する方法まとめ
- TRIM(col):前後の半角スペースを除去。最も標準的でどのRDBMSでも使える
- LTRIM(col) / RTRIM(col):片側だけ除去したい場合に使用
- REPLACE(col, ‘ ‘, ”):中間スペースも含めて全削除。単語間も消えるので注意
- 全角スペースは REPLACE(col, ‘ ’, ”) または CHR(12288) で対応
- UPDATE 前は必ず SELECT で対象件数と変更内容を確認する
