2017-11-11 117 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

或者使用我提供的函數,它循環訪問數組,直到找到指定鍵中具有指定值的第一個對象,並返回最後一個參數中指定的鍵的值。 –