簡體   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