MySQL JSON数据类型

时间:2017-11-11 10:19:06

标签: mysql json

我将此数据存储在lookup.lov_data(JSON数据类型)中:

[
  {"value":"SEL", "label":"Selangor"},
  {"value":"KUL", "label":"Kuala Lumpur"}
]

我希望得到雪兰莪的结果。什么是查询?

我试过了:

SELECT lov_data->'$[*].label' AS state 
FROM lookup 
WHERE JSON_CONTAINS(lov_data->'$[*].value', JSON_ARRAY("SEL"));

如果只有单个数据不在数组中,我可以简单地使用:

SELECT lov_data->'$.label' AS state 
FROM lookup 
WHERE lov_data->'$.value' = 'SEL'

1 个答案:

答案 0 :(得分:1)

目前(MySQL版本5.7.20),在给定对象的一个​​键的值的情况下,无法从对象数组中提取对象。 函数JSON_EXTRACT允许您选择数组中的项目,但它是基于索引的。除了选择整个数组的 $ [*] 之外,您只能使用 $ [i] ,其中 i 必须是整数且表示所需项目的索引。 如果可以将json对象放在$中,就像这样: $ [' {" value":" SEL"}'] ,你的问题解决了。不幸的是,现在这是不可能的,目前在单个选择语句中获得所需输出的唯一方法是:

SELECT lov_data->'$[0].label' AS state FROM lookup 
WHERE JSON_CONTAINS(lov_data->'$[*].value', JSON_ARRAY("SEL"));

这可能不是你需要的(即你应该提前知道所需的项目索引)。

但你可以存储这样的函数:

DROP FUNCTION IF EXISTS from_json_array;

DELIMITER //
CREATE FUNCTION from_json_array(jarray JSON, object_key VARCHAR(24), object_value VARCHAR(128), select_key VARCHAR(24))
RETURNS JSON
BEGIN

    DECLARE jindex INT DEFAULT 0;
    DECLARE jitem JSON;

    WHILE(1)
    DO          
        SET jitem = JSON_EXTRACT(jarray, CONCAT('$[', jindex, ']'));

        IF jitem IS NULL THEN
            RETURN NULL;
        END IF;

        IF JSON_CONTAINS(jitem, JSON_OBJECT(object_key, object_value)) THEN
            RETURN JSON_EXTRACT(jitem, CONCAT('$.', select_key));
        END IF;

        SET jindex = jindex + 1;

    END WHILE;
END//

DELIMITER ;

并以这种方式使用它:

SELECT from_json_array( 
  (SELECT JSON_EXTRACT(lov_data, '$[*]') FROM lookup WHERE 
   JSON_CONTAINS(lov_data, JSON_OBJECT('value', 'SEL'))), 
'value', 'SEL', 'label') AS state;