我在Postgres表中有以下两列
name | last_name
----------------
AA | AA aa
BBB | BBB bbbb
.... | .....
.... | .....
如何通过删除last_name
文字来更新name
?
最终出局应该像
name | last_name
----------------
AA | aa
BBB | bbbb
.... | .....
.... | .....
答案 0 :(得分:15)
UPDATE table SET last_name = regexp_replace(last_name, '^' || name || ' ', '');
这只会从列的开头删除一个副本,并正确删除尾随空格。
修改强>
我在这里使用正则表达式。 '^' || name || ' '
构建正则表达式,因此使用'Davis McDavis'示例,它构建正则表达式'^Davis '
。 ^
导致正则表达式锚定到字符串的开头,因此它将匹配单词'Davis',后跟一个空格仅在字符串的开头替换,这是last_name
列。
如果没有像这样的正则表达式,你可以达到同样的效果:
UPDATE table SET last_name = substr(last_name, length(name) + 2);
您需要在长度上添加两个来创建偏移量,因为substr是从一开始的(+1)并且您想要包含空格(+1)。但是,我更喜欢正则表达式解决方案,即使它可能表现更差,因为我发现它更自我记录。它具有幂等性的额外优势:如果在数据库上再次运行它将不会产生任何影响。 substr/offset
方法不是幂等的;如果你再次运行它,它会从你的姓氏中吃掉更多的字符。
答案 1 :(得分:5)
不确定语法,但试试这个:
UPDATE table
SET last_name = TRIM(REPLACE(last_name,name,''))
我建议先选择以下方式检查:
SELECT REPLACE(last_name,name,'') FROM table
答案 2 :(得分:4)
您需要替换功能,请参阅http://www.postgresql.org/docs/8.1/static/functions-string.html
UPDATE table SET last_name = REPLACE(last_name,name,'')