目前(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
或者使用我提供的函數,它循環訪問數組,直到找到指定鍵中具有指定值的第一個對象,並返回最後一個參數中指定的鍵的值。 –