最通用的方法,适用于大多数数据库:
-- 去除两端空格
SELECT TRIM(' Hello World ') AS result; -- 'Hello World'
-- 去除左侧空格
SELECT LTRIM(' Hello World') AS result; -- 'Hello World'
-- 去除右侧空格
SELECT RTRIM('Hello World ') AS result; -- 'Hello World'
-- PostgreSQL/MySQL还可指定字符
SELECT TRIM(BOTH ' ' FROM ' Hello World ');
适用于需要去除字符串中所有空格的场景:
-- 去除所有空格(包括中间空格)
SELECT REPLACE('Hello World SQL', ' ', '') AS result; -- 'HelloWorldSQL'
-- 实际表操作示例
UPDATE users
SET username = REPLACE(username, ' ', '')
WHERE username LIKE '% %';
更灵活,可处理多种空白字符:
-- PostgreSQL/MySQL 8.0+/Oracle
-- 去除所有空白字符(空格、制表符、换行符)
SELECT REGEXP_REPLACE('Hello World\tSQL\n', '\s+', '') AS result;
-- 只去除首尾空白
SELECT REGEXP_REPLACE(' Hello World ', '^\s+|\s+$', '') AS result;
-- 将多个连续空格替换为单个空格
SELECT REGEXP_REPLACE('Hello World SQL', '\s+', ' ') AS result;
处理复杂空格情况:
-- 先去除首尾空格,再将中间多个空格替换为单个
SELECT REPLACE(REPLACE(TRIM(' Hello World '), ' ', ' '), ' ', ' ') AS result;
-- 或使用更精确的方法
SELECT TRIM(
REPLACE(
REPLACE(
REPLACE(' Hello World ', ' ', ' ^'),
' ^', ''),
'^ ', '')
) AS result;
Oracle等数据库专用:
-- Oracle: 删除所有空格
SELECT TRANSLATE('Hello World SQL', ' ' || 'Hello World SQL', 'HelloWorldSQL')
FROM dual;
-- 更简单的Oracle方法
SELECT REPLACE(TRANSLATE('Hello World', ' ', ' '), ' ', '') FROM dual;
处理可能为NULL的情况:
-- 安全地去除空格,处理NULL值
SELECT
CASE
WHEN column_name IS NULL THEN NULL
ELSE TRIM(column_name)
END AS cleaned_column
FROM table_name;
-- 或使用COALESCE
SELECT TRIM(COALESCE(column_name, '')) AS cleaned_column
FROM table_name;
| 方法 | 适用场景 | 性能 | 跨数据库兼容性 |
|---|---|---|---|
| TRIM() | 去除首尾空格 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| REPLACE() | 去除所有空格 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| REGEXP_REPLACE() | 复杂模式匹配 | ⭐⭐⭐ | ⭐⭐⭐ |
| 嵌套函数 | 特定清理需求 | ⭐⭐ | ⭐⭐⭐⭐ |
| TRANSLATE() | Oracle环境 | ⭐⭐⭐⭐ | ⭐ |
-- 示例1:清理用户输入数据
UPDATE customers
SET
first_name = TRIM(first_name),
last_name = TRIM(last_name),
email = LOWER(TRIM(email));
-- 示例2:查询时动态清理
SELECT
TRIM(first_name) || ' ' || TRIM(last_name) AS full_name,
REPLACE(phone, ' ', '') AS clean_phone
FROM contacts
WHERE TRIM(address) LIKE '%New York%';
-- 示例3:创建清理数据的视图
CREATE VIEW clean_employee_data AS
SELECT
employee_id,
TRIM(first_name) AS first_name,
TRIM(last_name) AS last_name,
REGEXP_REPLACE(phone, '[-\s()]', '') AS clean_phone
FROM employees;
选择方法时应考虑:
最常用的组合是:TRIM()处理首尾空格 + REPLACE()处理中间多余空格,兼顾效率和兼容性。