sql >> Database >  >> RDS >> MariaDB

Elementen retourneren van een JSON-array in MariaDB

MariaDB bevat twee selectors waarmee we elementen uit JSON-arrays kunnen selecteren:

  • [N] selecteert elementnummer N in de array (bijvoorbeeld [0] om het eerste element te selecteren).
  • [*] selecteert alle elementen in de array.

Deze kunnen worden gebruikt in een aantal JSON-functies die zijn opgenomen in MariaDB. De volgende voorbeelden gebruiken ze met de JSON_EXTRACT() functie om geselecteerde array-elementen terug te geven.

Voorbeeld – [N]

Hier is een eenvoudig voorbeeld om te demonstreren hoe u een enkel array-element selecteert:

SELECT JSON_EXTRACT('[1,2,3]', '$[1]');

Resultaat:

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

Arrays zijn gebaseerd op nul, en dus $[1] selecteert het tweede array-element.

Hier is nog een voorbeeld, deze keer met een iets groter JSON-document:

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

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

Resultaat:

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

In dit geval .sizes specificeert de sizes objectlid, en dus $.sizes[1] selecteert het tweede item in de sizes array.

Voorbeeld- [*]

De [*] selector selecteert alle elementen in de array.

Voorbeeld:

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

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

Resultaat:

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

In dit geval ziet het resultaat er precies hetzelfde uit als de originele array. In dat geval had het kunnen worden geretourneerd door gewoon $.sizes op te geven. .

Meerdere arraykiezers

Maar hier is nog een voorbeeld dat twee arrayselectors gebruikt.

Eerst gebruiken we een jokertekenkiezer om alle elementen in de array te selecteren. Vervolgens gebruiken we een andere arrayselector om alleen het tweede element in een array te selecteren die in die elementen is genest:

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]');

Resultaat:

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

Wildcard-stap

Als uw JSON-document meerdere arrays met dezelfde naam bevat, sommige genest op verschillende niveaus of in hun eigen object, kunt u ze allemaal selecteren met behulp van de jokerstap (** ). De wildcard-stap selecteert recursief alle onderliggende elementen van het huidige element.

Hier gebruiken we het om een ​​JSONPath-expressie te bouwen die het tweede array-element retourneert van alle arrays genaamd sizes , inclusief arrays die zijn genest in andere documenten:

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]');

Resultaat:

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

  1. Batch-modus normalisatie en prestaties

  2. Aan de slag met SQL Server 2017 op Linux in de Azure-portal

  3. Een subtekenreeks retourneren van een tekenreeks in SQL Server met behulp van de SUBSTRING()-functie

  4. Is er in Oracle een functie die het verschil tussen twee datums berekent?