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

Mit*_*ran 7 sql postgresql

我在Postgres表中有以下两列

name | last_name
----------------
AA   | AA aa
BBB  | BBB bbbb
.... | ..... 
.... | ..... 
Run Code Online (Sandbox Code Playgroud)

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

最终出局应该是这样的

name | last_name
----------------
AA   | aa
BBB  | bbbb
.... | ..... 
.... | ..... 
Run Code Online (Sandbox Code Playgroud)

Dan*_*ons 15

UPDATE table SET last_name = regexp_replace(last_name, '^' || name || ' ', '');
Run Code Online (Sandbox Code Playgroud)

这仅从列的开头删除一个副本并正确删除尾随空格.

编辑

我在这里使用正则表达式.'^' || name || ' '构建正则表达式,因此使用'Davis McDavis'示例,它构建正则表达式'^Davis '.的^原因正则表达式锚定到字符串的开始,所以这将字匹配"戴维斯"后面加一个空格才刚刚开始被替换字符串,这是中last_name柱.

没有像这样的正则表达式,你可以达到同样的效果:

UPDATE table SET last_name = substr(last_name, length(name) + 2);
Run Code Online (Sandbox Code Playgroud)

您需要在长度上添加两个来创建偏移量,因为substr是从一开始的(+1)并且您想要包含空格(+1).但是,我更喜欢正则表达式解决方案,即使它可能表现更差,因为我发现它更加自我记录.它具有幂等性的额外优势:如果在数据库上再次运行它将不会产生任何影响.该substr/offset方法不是幂等的; 如果你再次运行它,它会从你的姓氏中吃掉更多的字符.


lvi*_*vil 5

不确定语法,但试试这个:

UPDATE table   
SET last_name = TRIM(REPLACE(last_name,name,''))  
Run Code Online (Sandbox Code Playgroud)

我建议先选择以下方法进行检查:

 SELECT REPLACE(last_name,name,'')  FROM  table 
Run Code Online (Sandbox Code Playgroud)


Vik*_*ram 5

您需要替换功能,请参阅http://www.postgresql.org/docs/8.1/static/functions-string.html

UPDATE table SET last_name = REPLACE(last_name,name,'')
Run Code Online (Sandbox Code Playgroud)