如何用同一数据表中某列的部分内容替换另一列的全部内容?
用同一数据表某列的部分内容替换另一列的实现方案
嘿,这个需求挺典型的!核心就是从columnA里提取最后一段(比如/home/docs/test1里的test1),然后把columnB全表替换成这个提取出来的值。下面我分几种主流数据库给你具体的SQL写法,你对应自己用的数据库来就行:
MySQL/MariaDB 实现
用SUBSTRING_INDEX函数就很方便,这个函数可以按指定分隔符截取字符串,最后一个参数写-1表示取最后一段:
-- 先测试提取结果是否正确 SELECT columnA, SUBSTRING_INDEX(columnA, '/', -1) AS target_value FROM your_table_name; -- 确认没问题后执行更新 UPDATE your_table_name SET columnB = SUBSTRING_INDEX(columnA, '/', -1);
PostgreSQL 实现
可以用正则匹配或者字符串分割的方式,这里推荐用正则截取最后一段的写法,直观易懂:
-- 测试提取结果 SELECT columnA, regexp_replace(columnA, '.*/', '') AS target_value FROM your_table_name; -- 执行更新 UPDATE your_table_name SET columnB = regexp_replace(columnA, '.*/', '');
或者用split_part结合数组长度的方式,也能实现:
UPDATE your_table_name SET columnB = split_part(columnA, '/', array_length(string_to_array(columnA, '/'), 1));
SQL Server 实现
这里需要借助REVERSE和CHARINDEX来定位最后一个/的位置:
-- 测试提取结果 SELECT columnA, REVERSE(SUBSTRING(REVERSE(columnA), 1, CHARINDEX('/', REVERSE(columnA)) - 1)) AS target_value FROM your_table_name; -- 执行更新 UPDATE your_table_name SET columnB = REVERSE(SUBSTRING(REVERSE(columnA), 1, CHARINDEX('/', REVERSE(columnA)) - 1));
Oracle 实现
用REGEXP_SUBSTR正则截取是最简洁的,直接匹配最后一个/后面的所有内容:
-- 测试提取结果 SELECT columnA, REGEXP_SUBSTR(columnA, '[^/]+$') AS target_value FROM your_table_name; -- 执行更新 UPDATE your_table_name SET columnB = REGEXP_SUBSTR(columnA, '[^/]+$');
重要提醒
别忘了在执行UPDATE之前,一定要先跑SELECT语句验证提取的结果是不是你想要的test1这类值! 避免因为函数参数写错或者数据格式不一致导致更新错误,如果是生产环境,最好先备份表再操作哦~
内容的提问来源于stack exchange,提问作者udhkl
相关产品推荐
相关产品推荐

