MySql JSON在WHERE中嵌套数组值比较(更大/更低)

时间:2017-01-18 13:30:18

标签: mysql arrays json

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;

0 个答案:

没有答案