2017-11-11 122 views
1

我存储在lookup.lov_data这个数据(JSON数据类型):MySQL的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

目前(MySQL版本20年5月7日),有没有办法从一个对象数组中提取一个对象,给定对象的一个​​键的值。 函数JSON_EXTRACT允许您选择数组中的项目,但它是基于索引的。除了$ [*],选择整个阵列,您只能使用$ [i],其中必须是一个整数,并表示所需项目的索引。 如果可以把一个json对象放在$中,像这样:$ ['{“value”:“SEL”}'],你的问题就解决了。不幸的是,这不是不可能性,现在,以获得所需的输出中,一个SELECT语句中的唯一途径,此刻是:

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; 
+0

谢谢你的解释。因此,我们需要事先知道确切的索引 – Coisox

+0

或者使用我提供的函数,它循环访问数组,直到找到指定键中具有指定值的第一个对象,并返回最后一个参数中指定的键的值。 –