如何在PostgreSQL中按第一个空格分割字符串

5

我在PostgreSQL数据库中有一列,我希望能够进行Flyway迁移,根据第一个空格来将全名拆分成名字和姓氏。但是有些行存在问题,可能只有一个单词或多个单词。例如:

| fullname         |
| ---------------- |
| Admin            |
| Jon Doe          |
| Vincent Van Gogh |

我希望您将fullname列迁移到:
| first_name | last_name |
| -----------|---------- |
| Admin      |           |
| John       | Doe       |
| Vincent    | Van Gogh  |

错误的解决方案: 我尝试了几个正则表达式来找到正确的正则表达式,以便在第一个空格出现时拆分字符串。但是,所有尝试都失败了。是否有人可以帮我找到适当的regex,以便在第一个空格出现时拆分字符串?或者使用regexp_split_to_array()之外的其他PostgreSQL方法会更好吗?

正确的解决方案: 我想在第一个空格处将字符串拆分,但是我的正则表达式尝试都失败了。请问是否有更好的方法来实现此目的?如果没有,请提供正确的正则表达式。谢谢!

UPDATE users
    SET first_name = (regexp_split_to_array(users.full_name, '\s+'))[1], 
        last_name  = (regexp_split_to_array(users.full_name, '\s+'))[2], 

对于正则表达式 '\s+',数组将被创建为3个元素,并且对于文森特·梵高的情况,仅会在第二个元素中填充姓氏。

| first_name | last_name |
| -----------|---------- |
| Admin      |           |
| John       | Doe       |
| Vincent    | Van       | <- Missing Gogh surname
1个回答

14

您可以使用substring

UPDATE users
    SET first_name = substring(users.full_name, '^\S+'),
        last_name = substring(users.full_name, '^\S+\s+(.*)'),

^\S+模式匹配字符串开始处的一个或多个非空白字符。

^\S+\s+(.*)模式匹配以1个或多个非空白字符开头,接着是1个或多个空格字符,并捕获0个或多个字符到第1组中。括号内的部分, 即为捕获组模式,这是substring将返回的内容。

但如果模式包含任何括号,则将返回与第一个子表达式(左括号最先出现的一个)匹配的文本部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接