我在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方法不是幂等的; 如果你再次运行它,它会从你的姓氏中吃掉更多的字符.
不确定语法,但试试这个:
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)
您需要替换功能,请参阅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)
| 归档时间: |
|
| 查看次数: |
16689 次 |
| 最近记录: |