如何在PostgreSQL中第一次出现空格时拆分字符串

时间:2018-11-07 16:36:45

标签: java regex 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个元素创建数组,如果使用Vincent Van Gogh,则仅将last_name填充到第二个元素。

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

1 个答案:

答案 0 :(得分:2)

您可以使用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将返回括号部分,即捕获组模式。

  

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