PostgreSQL更新子字符串替换

18

我有一个测试数据库中的几行数据,其中值前面带有美元符号。我想要更新test1表中name行的值,但是当我使用以下查询语句时,它清空了name列中的六行数据...

UPDATE test1 SET name=overlay('$' placing '' from 1 for 1);

所以当我打算使该列/行值变为"user"时,"$user"变成了""。

如何在不删除任何其他数据的情况下结合UPDATE和substr替换?

如果没有美元符号,我希望该行保持不变。

美元符号仅在第一个字符出现时才会出现。


4
将变量name中的"$"字符替换为空字符串。 - user330315
@a_horse_with_no_name 谢谢,这个方法可行。不过我声望不够,无法点赞。我很好奇如果美元符号只是第一个字符,该怎么做呢?我尝试了这个语句,但它会替换掉所有的美元符号,而不管位置。我尝试了 UPDATE test1 SET name = replace(name, '$', '', from 1 for 1); ,但没有成功;如果您能把它作为答案发布,我会很高兴接受它。 - user3750809
2个回答

36

如果您想替换所有美元符号,请使用以下代码:

update test1 
   set name = replace(name, '$', '');
如果您想只替换值开头的$,则可以使用substr()where子句仅更改那些列实际上以$开头的行。
update test1 
    set name = substr(name, 2)
where name like '$%';

很有趣,我之前没有考虑过使用 substr,那么你觉得无法将 replaceFROM 结合起来使用吗? - user3750809
@user312854:不知道。我从来没有习惯过那种形式的 replace() 函数。对于更复杂的替换任务,我通常使用 regexp_replace() - user330315
我想不出任何情况,至少是一时的,需要在第一个和最后一个字符之间的特定位置上持续替换字符,虽然我想replaceFROM应该比使用正则表达式更有效率?虽然我相当擅长正则表达式,但我会尽量避免使用它,除非我真的必须这样做以减少服务器负载。 - user3750809

0

根据提问者心中的模式来回答这个问题。

UPDATE test1 SET name=overlay(name placing '' from 1 for 1)
WHERE name like '$%';

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接