【问题标题】:Split a string into two fields based on multiple words根据多个单词将字符串拆分为两个字段
【发布时间】:2019-01-31 21:11:53
【问题描述】:
我的表名中有以下列:STAT
如果有人可以协助编写mysql脚本会很有帮助
我想将字符串分成 2 列。然而,拆分应该只基于最后一个词,即区域,如下例所示。
有一个例外,如果该地区是北美,那么应该考虑最后两个词来完成拆分,见下文
该脚本应将新列添加到名为 STAT 的现有表或新表中。
---------------------
Name
---------------------
P1 xx ASPAC
P1 yy EMEA
P1 zz uu EMEA
P2 oouu_xsh-s EMEA
P2 xx tt North America
---------------------
P2 Region
---------------------
P1 xx ASPAC
P1 yy EMEA
P1 zz uu EMEA
P2 oouu_xsh-s EMEA
P2 xx tt North America
【问题讨论】:
标签:
mysql
sql
regex
database
string
【解决方案1】:
如果您使用的是 MySQL 8.0,则可以使用REGEXP_REPLACE() 函数将进程拆分为正则表达式。
正则表达式^(.*) (.*)$ 将字符串一分为二:字符串中最后一个空格之前的所有内容都转到特殊变量$1,最后一个空格之后的所有内容都转到$2。当字符串以North America 结尾时需要特别小心。
考虑:
WITH data AS (
SELECT 'P1 xx ASPAC' name UNION SELECT 'P1 yy EMEA' UNION SELECT 'P1 zz uu EMEA'
UNION SELECT 'P2 oouu_xsh-s EMEA' UNION SELECT 'P2 xx tt North America'
)
SELECT
name,
CASE
WHEN name like '% North America' THEN REPLACE(name, ' North America', '')
ELSE REGEXP_REPLACE(name, '^(.*) (.*)$', '$1')
END P2,
CASE
WHEN name like '% North America' THEN 'North America'
ELSE REGEXP_REPLACE(name, '^(.*) (.*)$', '$2')
END Region
FROM data
姓名 | P2 |地区
:--------------------- | :------------ | :------------
P1 xx 亚太地区 | P1 XX |亚太地区
P1 yy EMEA | P1 年年 |欧洲、中东和非洲
P1 zz uu EMEA | P1 zz uu |欧洲、中东和非洲
P2 ouuu_xsh-s EMEA | P2 ouuu_xsh-s |欧洲、中东和非洲
P2 xx tt 北美 | P2 xx tt |北美
Demo on DB Fiddle