sql >> Databáze >  >> RDS >> Mysql

Jak vygeneruji vnořené objekty json pomocí nativních funkcí json mysql?

Důvodem, proč dochází k těmto chybám, je to, že nadřazený objekt json neočekává sadu výsledků jako jeden ze svých vstupů, musíte mít jednoduché dvojice objektů jako {name, string} atd. hlášení o chybě – může být k dispozici v budoucích funkcích ... to jen znamená, že musíte převést své víceřádkové výsledky na zřetězení výsledků oddělených čárkami a poté převést na pole json.

U druhého příkladu jste to skoro měli.

Pomocí funkce GROUP_CONCAT

můžete dosáhnout toho, po čem toužíte
select json_object(
  'id',p.id 
 ,'desc',p.`desc`
 ,'child_objects',json_array(
                     (select GROUP_CONCAT(
                                 json_object('id',id,'parent_id',parent_id,'desc',`desc`)
                             )   
                      from child_table 
                      where parent_id = p.id))
                   )
 from parent_table p;

To téměř funguje, skončí to tak, že se s poddotazem zachází jako s řetězcem, který tam ponechává znaky escape.

'{\"id\": 1, 
\"desc\": \"parent row 1\", 
\"child_objects\": 
    [\"
    {\\\"id\\\": 1,
     \\\"desc\\\": \\\"child row 1\\\", 
    \\\"parent_id\\\": 1
    },
    {\\\"id\\\": 2, 
    \\\"desc\\\": \\\"child row 2\\\", 
    \\\"parent_id\\\": 1}\"
    ]
}'

Aby to fungovalo ve vhodném formátu, musíte změnit způsob vytváření výstupu JSON následovně:

select json_object(
  'id',p.id 
 ,'desc',p.`desc`
 ,'child_objects',(select CAST(CONCAT('[',
                GROUP_CONCAT(
                  JSON_OBJECT(
                    'id',id,'parent_id',parent_id,'desc',`desc`)),
                ']')
         AS JSON) from child_table where parent_id = p.id)

 ) from parent_table p;

To vám dá přesný výsledek, který požadujete:

'{\"id\": 1, 
\"desc\": \"parent row 1\", 
\"child_objects\": 
    [{\"id\": 1, 
    \"desc\": \"child row 1\", 
    \"parent_id\": 1
    }, 
    {\"id\": 2, 
    \"desc\": \"child row 2\", 
    \"parent_id\": 1
    }]  
}'


  1. Nesprávná syntaxe poblíž „“

  2. Maskování dat v reálném čase pomocí spouštěčů

  3. Jak CHAR() funguje v MariaDB

  4. Jak používat klauzuli hromadného sběru PL/SQL s příkazem FETCH INTO