postgresql 使用同一行中列的第二部分更新数据库中所有行中的列

qnzebej0  于 2023-01-08  发布在  PostgreSQL
关注(0)|答案(1)|浏览(131)

我试图更新我的数据库中的所有行,以将name(last,first)拆分为last_name,first_name和display_name,但我不确定从哪里获得正在更新的当前行的id。我当前的sql脚本沿着如下:

UPDATE user_profile 
SET last_name=(SELECT split_part(display_name,',',1) 
               FROM user_profile WHERE id=<current_id>;) 
WHERE last_name IS Null;
pod7payv

pod7payv1#

你不需要指定当前行id,普通的update是在每行上下文中操作的,如果你使用对display_name的引用,它会假设你指的是当前行中的行。

UPDATE user_profile 
SET   last_name = split_part(display_name,',',1)
WHERE last_name IS null;

您还可以一次拆分为两个字段:

UPDATE user_profile 
SET (first_name, last_name)
  = (coalesce(first_name,
              split_part(display_name,',',2)),
     coalesce(last_name,
              split_part(display_name,',',1)) );

coalesce()返回其参数列表中的第一个非空值,因此如果字段已经填充,则不会更改它。
Online demo
如果您确实需要,可以为表的两个示例设置别名并匹配它们,就像处理任何其他表一样

UPDATE user_profile AS u1
SET last_name=(SELECT split_part(u2.display_name,',',1)
               FROM user_profile AS u2 WHERE u2.id=u1.id) 
WHERE last_name IS null;

你不一定要用subselect来完成

UPDATE user_profile AS u1
SET last_name=split_part(u2.display_name,',',1)
FROM user_profile AS u2 
WHERE u2.id=u1.id
AND u1.last_name IS null;

当您想要特别引用同一个表中的某个*其他行时,这非常方便。

相关问题