该表包含json数据,我想从这个json中提取labelKey
表:d_json
| 数据|
| --|
| {“tag”:null,“options”:[{“labelKey”:“key10”,“value”:“yes”,“selected”:true},{“labelKey”:“key11”,“value”:“no”,“selected”:false}]}|
| {“tag”:null,“options”:[{“labelKey”:“key20”,“value”:“yes”,“selected”:true},{“labelKey”:“key21”,“value”:“no”,“selected”:false},{“labelKey”:“key22”,“value”:“no”,“selected”:false}]}|
我使用以下查询来提取“labelKey”
SELECT JSON_EXTRACT(JSON_EXTRACT(j.data,'$. options'),'$[*]. labelKey ')FROM d_json j AS result;
它返回以下结果
| 结果|
| --|
| [“key10”,“key12”]|
| [“key20”,“key21”,“key22”]|
但是我希望结果是平面的,每行包含一个元素而不是数组,例如
| 结果|
| --|
| “key10”|
| “key11”|
| “key21”|
| “key22”|
| “key23”|
没有得到任何线索如何扁平化结果数组
2条答案
按热度按时间egdjgwm81#
在mysql v8+上,你可以使用JSON_TABLE函数这样做:
字符串
测试结果:
| labelKey|
| --|
| 关键10|
| 关键11|
| 关键20|
| 关键21|
| 钥匙22|
这里有一个demo fiddle
编辑:
在较旧的MySQL版本上,尝试以下操作:
型
Demo fiddle的
我们的想法是用一个行号序列
CROSS JOIN
,然后使用相同的序列从一个GROUP_CONCAT
中提取值SUBSTRING_INDEX
。在上面的查询示例中,我使用了一个硬编码的行序列,格式为:型
理想情况下,最好的方法是找出所需的序列并动态地生成它。
更新:
在旧版本的MySQL上生成编号序列是一个挑战,特别是如果我们的目标是动态生成。有一种方法不是动态的,但可以从一个很长的查询中生成一个很大的编号序列,但如果你打算长时间使用这个序列,我建议你只为它创建一个表:
型
上面的查询将生成一个从1到1000的数字范围,并插入到一个表中。一旦你有了那个表,你只需要像这样写你的查询:
型
与上一个查询相比,最突出的变化是硬编码编号序列之间的切换,查询基本上是在最后的
JSON_EXTRACT
中获得由逗号分隔的总值,并将其与创建的number_seq
表连接以获得所需的行。这部分在这里:型
这里有一个更新的小提琴参考https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=ace8babce8d7bbb97f7e016a754e93a9
kmbjn2e32#
不知道你可以在MySQL的最早版本中做到这一点,但这对我来说在5. 7中是有效的。我使用JSON_ARRAYAGG来合并组合JSON数组,然后使用JSON_EXTRACT和
$[*][*]
来扁平化它们。字符串