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前最好先备份表,或者用事务包裹,出问题可以回滚