postgreSQL:设置基于单个子查询的字段值



我有一个值表。假设:

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):

  • 如果我可以通过将返回单行的子查询转换为简单的元组来修复上述查询。ie('abc', 'def')

  • 有另一种方法来执行上述更新

我会使用子字符串或regexp_replace:

子字符串提取所有非数字的内容:

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子句用于避免更新不需要更新的行

最新更新