sql >> Database teknologi >  >> RDS >> MariaDB

Sådan returneres elementer fra et JSON-array i MariaDB

MariaDB inkluderer to vælgere, der gør det muligt for os at vælge elementer fra JSON-arrays:

  • [N ] vælger elementnummer N i arrayet (f.eks. [0] for at vælge det første element).
  • [*] vælger alle elementer i arrayet.

Disse kan bruges i en række JSON-funktioner, der er inkluderet i MariaDB. Følgende eksempler bruger dem med JSON_EXTRACT() funktion for at returnere valgte matrixelementer.

Eksempel – [N ]

Her er et simpelt eksempel til at demonstrere, hvordan man vælger et enkelt array-element:

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

Resultat:

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

Arrays er nul-baserede, og derfor $[1] vælger det andet array-element.

Her er et andet eksempel, denne gang ved hjælp af et lidt større JSON-dokument:

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

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

Resultat:

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

I dette tilfælde .sizes angiver størrelserne objektmedlem, og så $.sizes[1] vælger det andet element i størrelserne array.

Eksempel- [*]

[*] selector vælger alle elementer i arrayet.

Eksempel:

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

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

Resultat:

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

I dette tilfælde ser resultatet nøjagtigt det samme ud som det oprindelige array, i hvilket tilfælde det kunne have været returneret blot ved at angive $.sizes .

Multiple Array Selectors

Men her er et andet eksempel, der bruger to array-vælgere.

Først bruger vi et jokertegn til at vælge alle elementer i arrayet. Så bruger vi en anden matrixvælger til kun at vælge det andet element i en matrix, der er indlejret i disse elementer:

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

Resultat:

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

Wildcard-trin

Hvis dit JSON-dokument indeholder flere arrays med samme navn, nogle indlejret på forskellige niveauer eller i deres eget objekt, kan du vælge dem alle ved hjælp af jokertegntrinnet (** ). Jokertegntrinnet vælger rekursivt alle underordnede elementer af det aktuelle element.

Her bruger vi det til at hjælpe med at bygge et JSONPath-udtryk, der returnerer det andet array-element fra alle arrays kaldet sizes , inklusive arrays, der er indlejret i andre dokumenter:

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

Resultat:

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

  1. Er en CASE-sætning og en DECODE ækvivalente?

  2. Brug af Intel Optane Storage til SQL Server

  3. Hvad er den hurtigste måde at afkorte tidsstempler til 5 minutter i Postgres?

  4. Interessante ting om I STEDET FOR triggere