在代码战中巧妙地使用了子字符串,有人能给我解释一下它是如何工作的吗博士后

57hvy0tb  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(312)

请帮助我解释一下编码人员是如何创建这个伟大的解决方案的,我将简要解释下表:

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的文档,没有提到这个方法,请向我解释一下他的伟大解决方案是如何工作的,或者向我指出一个网站的方向,该网站解释了这个解决方案的一些组成部分。
非常感谢,蒂姆

wydwbb8l

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 以上是:

name                    first_lastname   second_lastname  
Anibal Dorothea Tromp              the                IV
zpqajqem

zpqajqem2#

虽然你可以用 substring() 像这样——而且有很好的文档记录——这似乎是一个很好的用例 split_part() :

select split_part(name, ' ', 1),
       split_part(name, ' ', 2),
       split_part(name, ' ', 3),
       split_part(name, ' ', 4)

或者如果您需要更高级的拆分器,您可以使用 regexp_split_to_array() .

相关问题