在 mysql 查询中读取 json 数组
read json array on mysql query
我知道问题的口是心非的可能性,但我没有找到任何可以帮助我解决这个问题的方法。
我的 mysql 专栏上有这个 json:
[
{
"ddi": "55",
"routing_id": "7",
"price": {
"mt": 0.0285,
"mo": 0.0285
}
},
{
"ddi": "598",
"routing_id": "10",
"price": {
"mt": 0.06,
"mo": 0.06
}
}
]
当我执行以下查询时:
SELECT JSON_EXTRACT(my_column,'$[*].ddi') as ddi FROM my_table
我得到结果:
["55", "598"]
我的问题是:
有一种方法可以 return 行中的数据而不是 json 数组吗?
喜欢:
Ddi
55
598
您可以使用 JSON_TABLE
同样的方法
SELECT get_ddi.*
FROM my_table,
JSON_TABLE(my_column, '$[*]' COLUMNS (
my_column VARCHAR(40) PATH '$.ddi')
) get_ddi;
**Schema (MySQL v8.0)**
DROP TABLE IF EXISTS `my_table`;
CREATE TABLE IF NOT EXISTS `my_table` (
`id` SERIAL,
`my_column` JSON
);
INSERT INTO `my_table` (`id`, `my_column`)
VALUES
(1, '[
{
"ddi": "55",
"routing_id": "7",
"price": {
"mt": 0.0285,
"mo": 0.0285
}
},
{
"ddi": "598",
"routing_id": "10",
"price": {
"mt": 0.06,
"mo": 0.06
}
}
]');
**Query #1**
SELECT get_ddi.*
FROM my_table,
JSON_TABLE(my_column, '$[*]' COLUMNS (
my_column VARCHAR(40) PATH '$.ddi')
) get_ddi;
**Output**
| my_column |
| --------- |
| 55 |
| 598 |
根据@Guilherme Mascarenhas 下面的评论,所需的解决方案是 MariaDb。从版本 10.2.31 开始,MariaDB 不存在 JSON_TABLE
函数。
一个 hacky 解决方案可能是使用适当的 mariadb 序列 table(取决于行数)。 JSON_UNQUOTE 从提取的值中删除引号。 seq
用作索引从数组中获取指定的 ddi
值。
SELECT
JSON_UNQUOTE(JSON_EXTRACT(t.my_column, CONCAT('$[', seq_0_to_100.seq, '].ddi'))) AS getddi
FROM my_table t
JOIN seq_0_to_100
HAVING getddi IS NOT NULL;
**Output**
| my_column |
| --------- |
| 55 |
| 598 |
我知道问题的口是心非的可能性,但我没有找到任何可以帮助我解决这个问题的方法。
我的 mysql 专栏上有这个 json:
[
{
"ddi": "55",
"routing_id": "7",
"price": {
"mt": 0.0285,
"mo": 0.0285
}
},
{
"ddi": "598",
"routing_id": "10",
"price": {
"mt": 0.06,
"mo": 0.06
}
}
]
当我执行以下查询时:
SELECT JSON_EXTRACT(my_column,'$[*].ddi') as ddi FROM my_table
我得到结果:
["55", "598"]
我的问题是: 有一种方法可以 return 行中的数据而不是 json 数组吗? 喜欢:
Ddi
55
598
您可以使用 JSON_TABLE
同样的方法
SELECT get_ddi.*
FROM my_table,
JSON_TABLE(my_column, '$[*]' COLUMNS (
my_column VARCHAR(40) PATH '$.ddi')
) get_ddi;
**Schema (MySQL v8.0)**
DROP TABLE IF EXISTS `my_table`;
CREATE TABLE IF NOT EXISTS `my_table` (
`id` SERIAL,
`my_column` JSON
);
INSERT INTO `my_table` (`id`, `my_column`)
VALUES
(1, '[
{
"ddi": "55",
"routing_id": "7",
"price": {
"mt": 0.0285,
"mo": 0.0285
}
},
{
"ddi": "598",
"routing_id": "10",
"price": {
"mt": 0.06,
"mo": 0.06
}
}
]');
**Query #1**
SELECT get_ddi.*
FROM my_table,
JSON_TABLE(my_column, '$[*]' COLUMNS (
my_column VARCHAR(40) PATH '$.ddi')
) get_ddi;
**Output**
| my_column |
| --------- |
| 55 |
| 598 |
根据@Guilherme Mascarenhas 下面的评论,所需的解决方案是 MariaDb。从版本 10.2.31 开始,MariaDB 不存在 JSON_TABLE
函数。
一个 hacky 解决方案可能是使用适当的 mariadb 序列 table(取决于行数)。 JSON_UNQUOTE 从提取的值中删除引号。 seq
用作索引从数组中获取指定的 ddi
值。
SELECT
JSON_UNQUOTE(JSON_EXTRACT(t.my_column, CONCAT('$[', seq_0_to_100.seq, '].ddi'))) AS getddi
FROM my_table t
JOIN seq_0_to_100
HAVING getddi IS NOT NULL;
**Output**
| my_column |
| --------- |
| 55 |
| 598 |