【问题标题】:I need to split a mysql field (string) by multiple delimeters into json object我需要通过多个分隔符将 sql 字段(字符串)拆分为 json 对象
【发布时间】:2021-03-18 16:57:01
【问题描述】:

我继承了一个 mysql 数据库并试图将其迁移到 mongodb。有一个名为details 的字段包含一些我想要拆分的键值“对”。可能有一个键/值对,或者由多个分隔符拆分的多个对。我把对放在引号中,因为它们的格式很奇怪。它们由冒号: 分隔,键值由逗号, 分隔。例如,这里是一个这样的字段的值:

Normal Duty,5min:Heavy Duty,10min:Riser,10max:

这是 3 个键值对,由冒号分隔。如果可能的话,我想将它们放入一个 json 对象中,如下所示:

{
   'Normal Duty': '5min',
   'Heavy Duty': '10min',
   'Riser': '10max'
}

我认为如果 substring_index 只有一个具有单个分隔符的键/值对,我可以使用它来完成,但是我在想办法提取具有多个分隔符的多个键/值对时迷失了方向。我能够计算定界符的数量,SELECT id, details, LENGTH(details) - LENGTH(REPLACE(details, ':', '')) AS COUNT FROM type,但不确定如何在循环或其他内容中使用该数字。

【问题讨论】:

  • @Akina,不,它们可以包含 1、3、6 或 7 甚至 0。真的是任意数量的对。
  • @Akina 数据当前位于 MySQL 数据库版本 5.7.28
  • @Akina 我看到的最大数量是 6 对

标签: mysql json mysql-5.7


【解决方案1】:
SELECT test.id, 
       JSON_OBJECTAGG(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(test.value, ':', numbers.num), ':', -1), ',', 1),
                      SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(test.value, ':', numbers.num), ':', -1), ',', -1))
FROM test
CROSS JOIN ( SELECT 1 num UNION SELECT 2 UNION SELECT 3 UNION
             SELECT 4 UNION SELECT 5 UNION SELECT 6 ) numbers
WHERE numbers.num <= LENGTH(test.value) - LENGTH(REPLACE(test.value, ':', ''))
GROUP BY test.id

https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=d10261e21a0fb1c1060091e8b4e58d80

如果键值对的数量可能在6以上,则调整numbers子查询。

PS。要使用 JSON,我强烈建议您升级您的服务器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    相关资源
    最近更新 更多