将单个字段分成多个字段

时间:2019-07-09 20:36:52

标签: mysql

我有一个包含以下字段的表格: id,类型,日期,更改日志

changelog 字段有10条有用的信息,我想将其分解为各自的字段。新旧信息:名称,月份,年份,邮政编码,状态

所以我想创建一个包含以下字段的表: id,类型,日期,old_name,new_name,old_month,new_month,old_year,new_year,old_zipcode,new_zipcode,old_status,new_status

当所有5条信息都存在时,这很容易,但是当某些信息丢失时,我将无法使用它。任何帮助表示赞赏。

典型的变更日志字段没有所有这些信息,而只是要更新的信息。

例如:

id   type    date      changelog
101  upd     1/1/2019  ---!hash:ActiveSupport
                       name:
                       - Adam
                       - Chris
                       month:
                       - 7
                       - 12
                       status:
                       - 1
                       - 3

这将翻译为:

id  type  date    old_name  new_name  old_month  new_month  old_year  new_year  old_zipcode  new_zipcode  old_status  new_status
101 upd   1/1/19  Adam      Chris     7          12                                                       1           3

1 个答案:

答案 0 :(得分:0)

这不是一个完整的解决方案(它假定您已经知道值存在时就已经解析出它们了),但是它解决了丢失这些值时的处理方法:

INSERT INTO tableV2 (id, type, date, old_name, new_name, and so on....)
SELECT id, type, date
, CASE WHEN INSTR(changelog, 'name:') = 0 THEN NULL 
  ELSE (parse the value out here)
  END AS old_name
, CASE WHEN INSTR(changelog, 'name:') = 0 THEN NULL 
  ELSE (parse the value out here)
  END AS new_name
, and so on....
FROM tableV1
;

解析虽然很简单,但除了乏味之外,可能不会太困难。您将需要找到找到的“标记”位置,在其后找到3个换行符(第一个用于标记,第二个用于每个值),然后将其与其他string functions一起使用,例如SUBSTR,LEFT。 。以及一些CHAR_LENGTH('name:')之类的CHAR_LENGTH(标签字符串),只需稍作修改即可使每个标签的解析重复进行。