AI Summary 167.21771.1 SQL正则表达式 regexp_replace摘要 2026-10-18
SQL正则表达式 regexp_replace

SQL正则表达式 regexp_replace

SQL正则表达式regexp_replace()

UPDATE语句拆分地址其实很直接regexp_replace()替换内容

正则分组捕获提取需要的地址片段 分别更新到对应的列里

关键是利用正则里的括号()来标记要提取的部分, 在替换时引用这些分组

先测试提取逻辑

UPDATE 先用SELECT语句验证你的正则和提取逻辑是否正确,避免误改数据

customer_addresses

原始地址列是full_address

要拆分成street、city、postal_code三个列

以PostgreSQL为例,其他数据库语法略有差异

SELECT

full_address,

-- 引用第1个捕获组作为街道

regexp_replace(full_address, '正则表达式', '\1') AS extracted_street,

-- 引用第2个捕获组作为城市

regexp_replace(full_address, '正则表达式', '\2') AS extracted_city,

-- 引用第3个捕获组作为邮编

regexp_replace(full_address, '正则表达式', '\3') AS extracted_postal_code

FROM customer_addresses

-- 只筛选能匹配正则的行,避免无效提取

WHERE full_address ~ '正则表达式';

编写UPDATE语句

确认提取结果没问题后,就可以把逻辑改成UPDATE

两种常见数据库举例

例子1:PostgreSQL

UPDATE customer_addresses

SET

street = regexp_replace(full_address, '正则表达式', '\1'),

city = regexp_replace(full_address, '正则表达式', '\2'),

postal_code = regexp_replace(full_address, '正则表达式', '\3')

-- 只更新匹配正则的行,防止不匹配的地址被设为NULL

WHERE full_address ~ '正则表达式';

MySQL的正则分组引用用2

而不是\1,而且转义符要多写一个

UPDATE customer_addresses

SET

street = REGEXP_REPLACE(full_address, '正则表达式', '$1'),

city = REGEXP_REPLACE(full_address, '正则表达式', '$2'),

postal_code = REGEXP_REPLACE(full_address, '正则表达式', '$3')

WHERE full_address REGEXP '正则表达式';

额外提醒 #

处理不匹配的地址:如果有部分地址不符合正则格式,可以用CASE WHEN避免把这些地址的拆分列设为NULL

street = CASE WHEN full_address ~ '正则表达式' THEN regexp_replace(...) ELSE full_address END

备份数据

执行UPDATE前最好先备份表,或者用事务包裹,出问题可以回滚