2017-07-17 99 views
1

的關鍵查詢JSON:MariaDB的/ MySQL的 - 如何根據給定存儲在MariaDB的/ MySQL的以下JSON對象嵌套對象

SET @j = '{ 
    "thing": { 
     "sub_things": [ 
      { 
       "attribute": [ 
        { "1": 40 }, 
        { "5": 25 }, 
        { "13": 35 } 
       ] 
      }, 
      { 
       "attribute": [ 
        { "2": 50 }, 
        { "7": 50 } 
       ] 
      } 
     ] 
    } 
}' 

我將如何查詢這回sub_things其中的對象之一attribute數組有一個特定的鍵,例如關鍵是13這應該返回第一個sub_thing

謝謝!

+0

雖然這是可能的,但隱藏您想要在「JSON」中搜索的內容不一定是模式的最佳設計。 –

回答

3

我不確定在單個查詢中是否可以實現您所需的功能。

下面的存儲過程,也許可以給你一些想法(存儲過程適用於MariaDB的,併爲MySQL):

> DROP PROCEDURE IF EXISTS `JSON_query_based_on_key`; 
Query OK, 0 rows affected (0.01 sec) 

> DELIMITER // 

> CREATE PROCEDURE `JSON_query_based_on_key`(
-> `json` TEXT, 
-> `key` VARCHAR(5) 
->) 
-> BEGIN 
-> DECLARE `sub_things_current` INT 
->  DEFAULT JSON_LENGTH(`json`, '$.thing.sub_things') - 1; 
-> 
-> WHILE (`sub_things_current` > -1) DO 
->  IF NOT JSON_CONTAINS_PATH(
->  `json`, 
->  'one', 
->  CONCAT('$.thing.sub_things[', `sub_things_current`, '].attribute[*]."', `key`, '"') 
-> ) THEN 
->  SET `json` := JSON_REMOVE(
->   `json`, 
->   CONCAT('$.thing.sub_things[', `sub_things_current`, ']')); 
->  END IF; 
->  SET `sub_things_current` := `sub_things_current` - 1; 
-> END WHILE; 
-> 
-> SELECT JSON_EXTRACT(`json`, '$.thing'); 
-> END// 
Query OK, 0 rows affected (0.00 sec) 

> DELIMITER ; 

> CALL `JSON_query_based_on_key`('{ 
'> "thing": { 
'>  "sub_things": [ 
'>  { 
'>   "attribute": [ 
'>   { "1": 40 }, 
'>   { "5": 25 }, 
'>   { "13": 35 } 
'>   ] 
'>  }, 
'>  { 
'>   "attribute": [ 
'>   { "2": 50 }, 
'>   { "7": 50 } 
'>   ] 
'>  } 
'>  ] 
'> } 
'> }', '13'); 
+---------------------------------------------------------------------+ 
| JSON_EXTRACT(`json`, '$.thing')          | 
+---------------------------------------------------------------------+ 
| {"sub_things": [{"attribute": [{"1": 40}, {"5": 25}, {"13": 35}]}]} | 
+---------------------------------------------------------------------+ 
1 row in set (0.00 sec) 

Query OK, 0 rows affected (0.00 sec) 

修改代碼,你需要它。

對於MariaDB(5.7.17)的MariaDB(10.2.6)和db-fiddle,請參閱db<>fiddle

+0

優秀的答案! – Hackerman