postgresql SQL:基于单个子查询设置字段值

pn9klfpd  于 2022-12-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(145)

我有一张价值表。比如说:

create table table1 (FirstName varchar(255), LastName varchar(255));

INSERT INTO table1 (FirstName, LastName) VALUES ('Mariah1', 'Billy3');
INSERT INTO table1 (FirstName, LastName) VALUES ('Mo2', 'Molly2');
INSERT INTO table1 (FirstName, LastName) VALUES ('Sally3', 'Silly1');

我想更新所有值以删除名称中的数字。所以我尝试:

UPDATE table1 t
SET (FirstName, LastName) = (
  select
  regexp_matches(FirstName ,'(\w+)\d+') as updatedFirstName,
  regexp_matches(LastName ,'(\w+)\d+') as updatedLastName
  FROM table1 u
  WHERE u.FirstName = t.FirstName and u.LastName = t.LastName
)

但我得到的例子是
{Mariah}, {Billy}
作为值,而不是:
Mariah, Billy
我试着在最后添加[0],添加额外的()等没有运气。
我想知道(最好是psql):

  • 如果我可以通过将返回单行的子查询转换为简单的元组来修复上面的查询。
  • 我有另一种方法来完成上述更新
axkjgtzd

axkjgtzd1#

我会使用子字符串或regexp_replace:
substring提取所有非数字的内容:

update table1
   set firstname = substring(firstname from '[^0-9]+'),  
       lastname = substring(lastname from '[^0-9]+');
where firstname ~ '[0-9]'
   or lastname ~ '[0-9]';

或者使用regexp_replace删除数字:

update table1
   set firstname = regexp_replace(firstname, '[0-9]+', '', 'g'),
       lastname = regexp_replace(lastname, '[0-9]+', '', 'g')
where firstname ~ '[0-9]'
   or lastname ~ '[0-9]';

WHERE子句用于避免更新不需要更新的行

相关问题