programing

MariaDB/MySQL - 중첩된 객체의 키를 기반으로 JSON을 쿼리하는 방법

kingscode 2022. 10. 29. 10:22
반응형

MariaDB/MySQL - 중첩된 객체의 키를 기반으로 JSON을 쿼리하는 방법

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.

감사합니다!

한 번의 질문으로 당신이 필요한 것을 얻을 수 있을지는 잘 모르겠습니다.

다음과 같은 저장 프로시저를 통해 아이디어를 얻을 수 있습니다(저장 프로시저는 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)

필요에 따라서 코드를 변경합니다.

db <>fiddle for MariaDB(10.2.6) 및 db-fiddle for MySQL(5.7.17)을 참조하십시오.

언급URL : https://stackoverflow.com/questions/45143538/mariadb-mysql-how-to-query-json-based-on-key-of-nested-object

반응형