我在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
答案 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
将返回括号部分,即捕获组模式。
但是如果模式包含任何括号,则返回与第一个带括号的子表达式(左括号在前的那个)匹配的文本部分。