SQL - 从列的文本中删除子字符串

时间:2012-02-28 06:53:41

标签: sql postgresql

我在Postgres表中有以下两列

name | last_name
----------------
AA   | AA aa
BBB  | BBB bbbb
.... | ..... 
.... | ..... 

如何通过删除last_name文字来更新name

最终出局应该像

name | last_name
----------------
AA   | aa
BBB  | bbbb
.... | ..... 
.... | ..... 

3 个答案:

答案 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,'')