我将此数据存储在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'
答案 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;