我需要用多个分隔符将 mysql 字段(字符串)拆分为 json 对象
I need to split a mysql field (string) by multiple delimeters into json object
我继承了一个 mysql 数据库,我正在尝试将其迁移到 mongodb。有一个名为 details
的字段,其中包含一些我想拆分的键值“对”。可能有单个 key/value 对,或由多个定界符分隔的多对。我把对放在引号中,因为它们的格式很奇怪。它们由冒号 :
分隔,键值由逗号 ,
分隔。例如,这是一个这样的字段的值:
Normal Duty,5min:Heavy Duty,10min:Riser,10max:
这是 3 个键值对,以冒号分隔。如果可能的话,我想把它们放到一个 json 对象中,像这样:
{
'Normal Duty': '5min',
'Heavy Duty': '10min',
'Riser': '10max'
}
我想我可以使用 substring_index 来做到这一点,如果它只是具有单个定界符的单个 key/value 对,但我迷路了试图想出一种方法来提取多个 key/value 与多个定界符配对。我能够计算分隔符的数量,SELECT id, details, LENGTH(details) - LENGTH(REPLACE(details, ':', '')) AS COUNT FROM type
但不确定如何在循环或其他内容中使用该数字。
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,我强烈建议升级您的服务器。
我继承了一个 mysql 数据库,我正在尝试将其迁移到 mongodb。有一个名为 details
的字段,其中包含一些我想拆分的键值“对”。可能有单个 key/value 对,或由多个定界符分隔的多对。我把对放在引号中,因为它们的格式很奇怪。它们由冒号 :
分隔,键值由逗号 ,
分隔。例如,这是一个这样的字段的值:
Normal Duty,5min:Heavy Duty,10min:Riser,10max:
这是 3 个键值对,以冒号分隔。如果可能的话,我想把它们放到一个 json 对象中,像这样:
{
'Normal Duty': '5min',
'Heavy Duty': '10min',
'Riser': '10max'
}
我想我可以使用 substring_index 来做到这一点,如果它只是具有单个定界符的单个 key/value 对,但我迷路了试图想出一种方法来提取多个 key/value 与多个定界符配对。我能够计算分隔符的数量,SELECT id, details, LENGTH(details) - LENGTH(REPLACE(details, ':', '')) AS COUNT FROM type
但不确定如何在循环或其他内容中使用该数字。
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,我强烈建议升级您的服务器。