繁体   English   中英

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

[英]How to split up string on first whitespace occurance in 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,则仅将lastndname填充到第二个元素。

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

您可以使用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将返回的内容。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM