[英]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.