mySQL 将值拆分为多行
mySQL split values to multiple rows
我有 table :
id | f_name | m_name | l_name
1 | a b c | null | null
2 | a b c | null | null
3 | a b c | null | null
我想要这样的输出:
id | f_name | m_name | l_name
1 | a | b | c
2 | a | b | c
3 | a | b | c
我的 select 查询有效,数据输出就是这样。我在同时更新多个列时遇到了挑战。任何建议或有用的链接将不胜感激。
我的查询:
update tbl_client_test1 set f_name, m_name, l_name = (SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(f_name, ' ', 1), ' ', -1) AS f_name,
If( length(f_name) - length(replace(f_name, ' ', ''))>1,
SUBSTRING_INDEX(SUBSTRING_INDEX(f_name, ' ', 2), ' ', -1) ,NULL)
as m_name,
SUBSTRING_INDEX(SUBSTRING_INDEX(f_name, ' ', 3), ' ', -1) AS l_name
FROM tbl_client_test1)
虽然我同意 Tim Biegeleisen 的评论,但我也知道您并不总是对数据如何以您的方式有发言权。所以在那种情况下我会这样解决:
SELECT
REGEXP_SUBSTR(s.test, '[a-z]+', 1, 1) AS field1,
REGEXP_SUBSTR(s.test, '[a-z]+', 1, 2) AS field2,
REGEXP_SUBSTR(s.test, '[a-z]+', 1, 3) AS field3,
REGEXP_SUBSTR(s.test, '[a-z]+', 1, 4) AS field4,
REGEXP_SUBSTR(s.test, '[a-z]+', 1, 5) AS field5
FROM
(SELECT 'aaaa bbbbb cc ddddd eee f ggggg hh ii jj' AS test) AS s
适用于不同的字符串长度,但如果示例中的 'a b c' 值具有不同的格式,您可能需要调整正则表达式。
最后一个参数是正则表达式的第 n 次出现。参见 docs。
对于这个示例数据,这将起作用:
UPDATE tbl_client_test1
SET m_name = CASE
WHEN CHAR_LENGTH(f_name) - CHAR_LENGTH(REPLACE(f_name, ' ', '')) > 0
THEN SUBSTRING_INDEX(SUBSTRING_INDEX(f_name, ' ', 2), ' ', -1)
END,
l_name = CASE
WHEN CHAR_LENGTH(f_name) - CHAR_LENGTH(REPLACE(f_name, ' ', '')) > 1
THEN SUBSTRING_INDEX(f_name, ' ', -1)
END,
f_name = SUBSTRING_INDEX(f_name, ' ', 1);
请注意,f_name
在语句中最后更新,因为它用在更新其他 2 列的表达式中。
参见demo。
我有 table :
id | f_name | m_name | l_name
1 | a b c | null | null
2 | a b c | null | null
3 | a b c | null | null
我想要这样的输出:
id | f_name | m_name | l_name
1 | a | b | c
2 | a | b | c
3 | a | b | c
我的 select 查询有效,数据输出就是这样。我在同时更新多个列时遇到了挑战。任何建议或有用的链接将不胜感激。
我的查询:
update tbl_client_test1 set f_name, m_name, l_name = (SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(f_name, ' ', 1), ' ', -1) AS f_name,
If( length(f_name) - length(replace(f_name, ' ', ''))>1,
SUBSTRING_INDEX(SUBSTRING_INDEX(f_name, ' ', 2), ' ', -1) ,NULL)
as m_name,
SUBSTRING_INDEX(SUBSTRING_INDEX(f_name, ' ', 3), ' ', -1) AS l_name
FROM tbl_client_test1)
虽然我同意 Tim Biegeleisen 的评论,但我也知道您并不总是对数据如何以您的方式有发言权。所以在那种情况下我会这样解决:
SELECT
REGEXP_SUBSTR(s.test, '[a-z]+', 1, 1) AS field1,
REGEXP_SUBSTR(s.test, '[a-z]+', 1, 2) AS field2,
REGEXP_SUBSTR(s.test, '[a-z]+', 1, 3) AS field3,
REGEXP_SUBSTR(s.test, '[a-z]+', 1, 4) AS field4,
REGEXP_SUBSTR(s.test, '[a-z]+', 1, 5) AS field5
FROM
(SELECT 'aaaa bbbbb cc ddddd eee f ggggg hh ii jj' AS test) AS s
适用于不同的字符串长度,但如果示例中的 'a b c' 值具有不同的格式,您可能需要调整正则表达式。
最后一个参数是正则表达式的第 n 次出现。参见 docs。
对于这个示例数据,这将起作用:
UPDATE tbl_client_test1
SET m_name = CASE
WHEN CHAR_LENGTH(f_name) - CHAR_LENGTH(REPLACE(f_name, ' ', '')) > 0
THEN SUBSTRING_INDEX(SUBSTRING_INDEX(f_name, ' ', 2), ' ', -1)
END,
l_name = CASE
WHEN CHAR_LENGTH(f_name) - CHAR_LENGTH(REPLACE(f_name, ' ', '')) > 1
THEN SUBSTRING_INDEX(f_name, ' ', -1)
END,
f_name = SUBSTRING_INDEX(f_name, ' ', 1);
请注意,f_name
在语句中最后更新,因为它用在更新其他 2 列的表达式中。
参见demo。