MariaDB
 sql >> Base de Dados >  >> RDS >> MariaDB

Como retornar elementos de uma matriz JSON no MariaDB


O MariaDB inclui dois seletores que nos permitem selecionar elementos de arrays JSON:
  • [N] seleciona o número do elemento N na matriz (por exemplo, [0] para selecionar o primeiro elemento).
  • [*] seleciona todos os elementos na matriz.

Eles podem ser usados ​​em várias funções JSON incluídas no MariaDB. Os exemplos a seguir os usam com o JSON_EXTRACT() função para retornar elementos de matriz selecionados.

Exemplo – [N]


Aqui está um exemplo simples para demonstrar como selecionar um único elemento de matriz:
SELECT JSON_EXTRACT('[1,2,3]', '$[1]');

Resultado:
+---------------------------------+
| JSON_EXTRACT('[1,2,3]', '$[1]') |
+---------------------------------+
| 2                               |
+---------------------------------+

As matrizes são baseadas em zero e, portanto, $[1] seleciona o segundo elemento da matriz.

Aqui está outro exemplo, desta vez usando um documento JSON um pouco maior:
SET @json = '
    { 
        "_id": 1, 
        "product": "Left Handed Screwdriver", 
        "sizes": [ "S", "M", "L" ] 
    }
';

SELECT JSON_EXTRACT(@json, '$.sizes[1]');

Resultado:
+-----------------------------------+
| JSON_EXTRACT(@json, '$.sizes[1]') |
+-----------------------------------+
| "M"                               |
+-----------------------------------+

Neste caso, .sizes especifica os sizes membro do objeto, e assim $.sizes[1] seleciona o segundo item nos sizes variedade.

Exemplo- [*]


O [*] seletor seleciona todos os elementos na matriz.

Exemplo:
SET @json = '
    { 
        "_id": 1, 
        "product": "Left Handed Screwdriver", 
        "sizes": [ "S", "M", "L" ] 
    }
';

SELECT JSON_EXTRACT(@json, '$.sizes[*]');

Resultado:
+-----------------------------------+
| JSON_EXTRACT(@json, '$.sizes[*]') |
+-----------------------------------+
| ["S", "M", "L"]                   |
+-----------------------------------+

Nesse caso, o resultado parece exatamente igual ao array original, nesse caso, ele poderia ter sido retornado apenas especificando $.sizes .

Múltiplos seletores de matriz


Mas aqui está outro exemplo que usa dois seletores de matriz.

Primeiro, usamos um seletor curinga para selecionar todos os elementos do array. Em seguida, usamos outro seletor de matriz para selecionar apenas o segundo elemento em uma matriz aninhada nesses elementos:
SET @json = '
{ 
    "products" : 
    [
        { 
            "_id": 1, 
            "product": "Left Handed Screwdriver", 
            "sizes": [ "S", "M", "L" ] 
        },
        { 
            "_id": 2, 
            "product": "Long Weight", 
            "sizes": [ 8, 7, 10 ] 
        },
        { 
            "_id": 3, 
            "product": "Bottomless Coffee Cup", 
            "sizes": [ "Tall", "Grande", "Venti" ] 
        }
    ]
}
';

SELECT JSON_EXTRACT(@json, '$.products[*].sizes[1]');

Resultado:
+-----------------------------------------------+
| JSON_EXTRACT(@json, '$.products[*].sizes[1]') |
+-----------------------------------------------+
| ["M", 7, "Grande"]                            |
+-----------------------------------------------+

Etapa de curinga


Se o seu documento JSON contém vários arrays com o mesmo nome, alguns aninhados em diferentes níveis ou em seu próprio objeto, você pode selecioná-los todos com a ajuda da etapa curinga (** ). A etapa curinga seleciona recursivamente todos os elementos filho do elemento atual.

Aqui, nós o usamos para ajudar a construir uma expressão JSONPath que retorna o segundo elemento de array de todos os arrays chamados sizes , incluindo matrizes aninhadas em outros documentos:
SET @json = '[
    { 
        "_id": 1, 
        "product": { 
            "name" : "Tuxedo", 
            "color" : "Blue",
            "sizes": [ "S", "M", "L" ],
            "accessories" : {
                "belt" : {
                    "color" : "Navy",
                    "sizes" : [ "Wide", "Narrow" ]
                },
                "tie" : {
                    "color" : "Black",
                    "sizes" : [ "Short", "Medium", "Long" ]
                }
            }
        }
    }
]';

SELECT JSON_EXTRACT(@json, '$**.sizes[1]');

Resultado:
+-------------------------------------+
| JSON_EXTRACT(@json, '$**.sizes[1]') |
+-------------------------------------+
| ["M", "Narrow", "Medium"]           |
+-------------------------------------+