目前(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;
谢谢你的解释。因此,我们需要事先知道确切的索引 – Coisox
或者使用我提供的函数,它循环访问数组,直到找到指定键中具有指定值的第一个对象,并返回最后一个参数中指定的键的值。 –