我有一个包含以下字段的表格: 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
答案 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(标签字符串),只需稍作修改即可使每个标签的解析重复进行。