【问题标题】:mySQL split values to multiple rowsmySQL 将值拆分为多行
【发布时间】:2021-12-19 09:22:12
【问题描述】:

我有桌子:

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

我的选择查询有效,数据输出就是这样。我在同时更新多个列时遇到了挑战。任何建议或有用的链接将不胜感激。

我的查询:

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) 

【问题讨论】:

  • 您的第一个表中的数据还不是很适合导入 MySQL。我建议在将数据导入 MySQL 之前对其进行整理。

标签: mysql sql-update substring string-length


【解决方案1】:

虽然我同意 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

【讨论】:

    【解决方案2】:

    对于这个示例数据,这将起作用:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-28
      • 2020-12-19
      • 2015-02-18
      • 2021-12-07
      • 2021-08-31
      • 2018-10-12
      相关资源
      最近更新 更多