MySQL 5.7
MySQL JSON字段包含密钥" a"其中包含带键的JSON对象数组" c"它的价值观。如何格式化JSON_EXTRACT路径参数以获得更大的比较(更高或更低)那些" c"在SELECT语句的WHERE部分使用@v的值?
如果我们比较关键" d" (' $。d')> @v)对于@v的不同值,它将像魅力一样工作,但它与嵌套数组对象键的工作方式不同。
如果我们尝试比较键" c"数组中每个对象的值,它总是返回true' $。a [*]。c')> @v如果有ARRAY和INTEGER类型比较。根据MySQL手册,INTEGER的优先级低于ARRAY类型。
问题是如何比较" c"使用@v并仅查找带有JSON字段的记录,其中包含更高或更低的键值" c"。
SET @v = 70;
SELECT JSON_EXTRACT(
JSON_OBJECT(
'a',
JSON_ARRAY(
JSON_OBJECT('c', 25),
JSON_OBJECT('c', 70),
JSON_OBJECT('c', 35),
JSON_OBJECT('c', 30),
JSON_OBJECT('c', 17.5),
JSON_OBJECT('c',
JSON_ARRAY(
JSON_OBJECT('c', 35),
JSON_OBJECT('c', 30)
)
)
),
'b',
70
),
'$.a[*].c') > @v
;
要明确问题,请在下一个记录集中搜索价格高于70美元的记录:
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`data` json NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `test` (`data`) VALUES
('
{
"node": 1,
"orders": [
{
"ts": "Jan 13, 2016 04:38pm",
"order_id": 1,
"products": [
{
"Qty": 1,
"SKU": 1,
"price": 40,
"total": 40
},
{
"Qty": 2,
"SKU": 2,
"price": 80,
"total": 160
},
{
"Qty": 5,
"SKU": 3,
"price": 10,
"total": 50
}
]
}
]
}
'),
('
{
"node": 2,
"orders": [
{
"ts": "Jan 13, 2016 04:38pm",
"order_id": 2,
"products": [
{
"Qty": 3,
"SKU": 1,
"price": 40,
"total": 120
},
{
"Qty": 1,
"SKU": 3,
"price": 10,
"total": 10
}
]
}
]
}
');
选择有效的语句:
SELECT * FROM `test`
WHERE `data`->'$.node' > 1;
这应该有效,但不要:
SELECT * FROM `test`
WHERE `data`->'$.orders[*].order_id' > 1;
SELECT * FROM `test`
WHERE `data`->'$.orders[*].products[*].price' > 50;
SELECT * FROM `test`
WHERE `data`->'$.orders[*].products[*].total' < 30;