首页 > 解决方案 > 如何在 PostgreSQL 中第一次出现空格时拆分字符串

问题描述

我在 PostgreSQL DB 中有列,我想进行 Flyway 迁移,根据第一次出现的空白将全名拆分为 first_name 和 last_name。有一些胭脂行,要么只有一个词,要么只有几个词。例如:

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

我想将列全名迁移到:

| first_name | last_name |
| -----------|---------- |
| Admin      |           |
| John       | Doe       |
| Vincent    | Van Gogh  |

不正确的解决方案: 我尝试了几个正则表达式,以便找到正确的正则表达式来在第一次出现空格时拆分字符串。不幸的是,一切都没有成功。任何人都可以帮我找到正确的正则表达式来在第一次出现空格时拆分字符串吗?或者也许有比 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 个元素创建,并且在文森特梵高的情况下,last_name 仅填充第二个元素。

| first_name | last_name |
| -----------|---------- |
| Admin      |           |
| John       | Doe       |
| Vincent    | Van       | <- Missing Gogh surname

标签: javaregexpostgresql

解决方案


您可以使用substring

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

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

^\S+\s+(.*)模式匹配以 1+ 个非空白字符开头的字符串,然后具有 1+ 个空白字符,然后将任意数量的 0+ 个字符捕获到组 1 中。括号中的部分,捕获组模式,substring将返回。

但是,如果模式包含任何括号,则返回与第一个带括号的子表达式(左括号在前的那个)匹配的文本部分。


推荐阅读