请帮助我解释一下编码人员是如何创建这个伟大的解决方案的,我将简要解释下表:
select * from people
返回值:
name
Anibal Dorothea Tromp IV
这个挑战有很多种解决方法,但有一种解决方法让我非常惊讶:
select
substring(name, '^(.+)\s\S+\s\S+$') as name,
substring(name, '^.+\s(\S+)\s\S+$') as first_lastname,
substring(name, '^.+\s(\S+)$') as second_lastname
from people
返回结果:
name first_lastname second_lastname
Anibal Dorothea Tromp IV
真正的表有更多的行,有些是1个名字,有些是2个名字。所以我们的挑战是把名字分开,名字是一个不同长度的单词,有时超过一个单词。
如果我看了有关substring的文档,没有提到这个方法,请向我解释一下他的伟大解决方案是如何工作的,或者向我指出一个网站的方向,该网站解释了这个解决方案的一些组成部分。
非常感谢,蒂姆
2条答案
按热度按时间wydwbb8l1#
您所引用的这个特殊字符串称为正则表达式。正则表达式在许多rdbms和编程语言中都可用。
postgres在这里有相关文档:https://www.postgresql.org/docs/current/functions-matching.html
上面的查询有三个子字符串,其中包含正则表达式模式:
'^(.+)\s\S+\s\S+$'
匹配除最后两组以外的所有组。Anibal Dorothea
'^.+\s(\S+)\s\S+$'
匹配最后一组的第二个Tromp
'^.+\s(\S+)$'
最后一组IV
如果将输入文本更改为Anibal Dorothea Tromp the IV
来自select
以上是:zpqajqem2#
虽然你可以用
substring()
像这样——而且有很好的文档记录——这似乎是一个很好的用例split_part()
:或者如果您需要更高级的拆分器,您可以使用
regexp_split_to_array()
.