更新数据库所有行时如何获取当前行ID,拆分display_name为姓名列?
拆分display_name更新last_name和first_name的解决方案
你不需要通过子查询借助行ID来获取当前记录的display_name,UPDATE语句在处理每行数据时可以直接引用当前行的字段值,直接简化脚本即可:
基础版本(假设所有目标行的display_name都严格符合‘姓,名’格式)
UPDATE user_profile SET last_name = split_part(display_name, ',', 1), first_name = split_part(display_name, ',', 2) WHERE last_name IS NULL;
兼容格式不统一的版本(处理部分行无逗号的情况)
如果存在display_name没有逗号的异常数据,可以用CASE语句做兼容处理:
UPDATE user_profile SET last_name = CASE WHEN display_name LIKE '%,%' THEN split_part(display_name, ',', 1) ELSE display_name END, first_name = CASE WHEN display_name LIKE '%,%' THEN split_part(display_name, ',', 2) ELSE NULL END WHERE last_name IS NULL;
说明
split_part函数会按指定分隔符(这里是逗号)拆分字符串,第三个参数指定取第几个拆分后的部分。- WHERE条件
last_name IS NULL确保只更新未设置姓氏的记录,避免重复执行时覆盖已有数据。 - 不需要嵌套子查询定位行,UPDATE会自动逐行处理符合条件的记录,直接引用当前行的
display_name即可。
内容的提问来源于stack exchange,提问作者Nathan Smith
相关产品推荐
相关产品推荐

