【问题标题】:Split MariaDB column into three different columns将 MariaDB 列拆分为三个不同的列
【发布时间】:2021-01-15 09:26:46
【问题描述】:

我有一个表 loginData 作为

col
2020-11-30 03:38:01event_scheduler1
2020-11-30 03:38:01kaarmax1
2020-11-30 03:38:01mk_adp_integration_scheduler7
2020-11-30 03:38:01mk_appointment20
2020-11-30 03:38:01mk_appointment_push2
2020-11-30 03:38:01mk_arkona_integration_scheduler2
2020-11-30 03:38:01mk_batchjobs47
2020-11-30 03:38:01mk_billing10
2020-11-30 03:38:01mk_calender_bot9
2020-11-30 03:40:01mk_dms_adp_integration3
2020-11-30 03:42:01mk_dms_adp_integration3

我想将数据分成 3 个不同的列

time_stamp login number_of_login
2020-11-30 03:42:01 mk_dms_adp_integration 3

最后一个整数可以长于一位数,我的问题与其他问题不同,因为它没有分隔符

谢谢

【问题讨论】:

  • 使用REGEXP_REPLACE()
  • 您能否举个例子,我似乎无法弄清楚,如何将这些分成不同的列
  • time_stamp 具有固定长度,可以使用 SUBSTRING() 提取。 login 可以使用模式[a-z_]* 提取。 number_of_login 可以使用模式\d*$ 提取。
  • SELECT REGEXP_REPLACE(col,'[a-z_]*','') AS text from logindata 这似乎没有任何作用
  • 这是一个教训,数据应该在插入之前被拆分。

标签: mysql split mariadb multiple-columns


【解决方案1】:

只要文本的前 19 位始终是完整的日期时间戳,这不是一个特别困难的问题:

SELECT CAST(SUBSTRING(tmp.`col`, 1, 19) AS DATETIME) as `dts`, SUBSTRING(tmp.`col`, 20) as `login`, COUNT(SUBSTRING(tmp.`col`, 1, 19)) as `number_of_login`
  FROM (SELECT '2020-11-30 03:38:01event_scheduler1' as col UNION ALL 
        SELECT '2020-11-30 03:38:01kaarmax1' as col UNION ALL 
        SELECT '2020-11-30 03:38:01mk_adp_integration_scheduler7' as col UNION ALL 
        SELECT '2020-11-30 03:38:01mk_appointment20' as col UNION ALL 
        SELECT '2020-11-30 03:38:01mk_appointment20' as col UNION ALL 
        SELECT '2020-11-30 03:38:01mk_appointment20' as col UNION ALL 
        SELECT '2020-11-30 03:38:01mk_appointment20' as col UNION ALL 
        SELECT '2020-11-30 03:38:01mk_arkona_integration_scheduler2' as col UNION ALL 
        SELECT '2020-11-30 03:38:01mk_billing10' as col UNION ALL 
        SELECT '2020-11-30 03:38:01mk_billing10' as col UNION ALL 
        SELECT '2020-11-30 03:38:01mk_calender_bot9' as col UNION ALL 
        SELECT '2020-11-30 03:40:01mk_dms_adp_integration3' as col UNION ALL 
        SELECT '2020-11-30 03:40:01mk_dms_adp_integration3' as col) tmp 
 GROUP BY `dts`, `login`;

我已经修改了您的一些示例数据以在 number_of_login 列中显示不同的值。

【讨论】:

    【解决方案2】:

    第 1 步 ALTER TABLE tmp.data ADD COLUMN time_stamp TIMESTAMP NULL after col, ADD COLUMN logins VARCHAR(500) NULL after time_stamp, ADD COLUMN no_of_logins INT NULL after logins;

    第 2 步

    update tmp.data set time_stamp = left(tmp.data.col, 19), logins = REGEXP_REPLACE(tmp.data,'[0-9]|-|:',''), no_of_logins = REGEXP_REPLACE(substring(tmp.data.col,20),'[a-z]|_','')

    可能效率不是很高,但这是我使用的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-15
      • 1970-01-01
      • 2019-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多