sql >> Database teknologi >  >> RDS >> SQLite

Operatør

I SQLite er ->> operatør udtrækker en underkomponent fra et JSON-dokument og returnerer en SQL-repræsentation af den underkomponent.

->> operator blev først introduceret i SQLite version 3.38.0 (frigivet den 22. februar 2022).

Syntaks

Syntaksen ser sådan ud:

json ->> path

Hvor json er JSON-dokumentet og sti er stien til underkomponenten, som vi ønsker at udtrække fra den.

Så vi leverer et JSON-dokument til venstre for operatøren, og vi angiver stien, vi ønsker at udtrække, til højre for det.

->> operator returnerer altid en SQL-repræsentation af den angivne underkomponent. For at returnere en JSON-repræsentation skal du bruge -> operatør i stedet.

Eksempler

Her er et simpelt eksempel til at demonstrere, hvordan ->> operatør virker:

SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$';

Resultat:

{"name":"Wag","type":"Dog"}

I dette tilfælde har jeg angivet en sti til '$' som returnerer hele dokumentet.

Lad os specificere en anden sti:

SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.type';

Resultat:

Dog

Vi kan også helt udelade dollartegnet og punktum, sådan her:

SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> 'type';

Resultat:

Dog

Her er det med et større JSON-dokument:

SELECT '[
        { 
        "user" : "Spike",
        "age" : 30,
        "scores" : [ 9, 7, 3 ]
        },
        { 
        "user" : "Faye",
        "age" : 25,
        "scores" : [ 90, 87, 93 ]
        },
        { 
        "user" : "Jet",
        "age" : 40,
        "scores" : [ 50, 38, 67 ]
        }
        ]' ->> '$[0]';

Resultat:

{"user":"Spike","age":30,"scores":[9,7,3]}

I SQLite er arrays nul-baserede, og specificerer derfor [0] returnerer det første array-element.

Hvis vi kun ville have den brugers score, kunne vi gøre dette:

SELECT '[
        { 
        "user" : "Spike",
        "age" : 30,
        "scores" : [ 9, 7, 3 ]
        },
        { 
        "user" : "Faye",
        "age" : 25,
        "scores" : [ 90, 87, 93 ]
        },
        { 
        "user" : "Jet",
        "age" : 40,
        "scores" : [ 50, 38, 67 ]
        }
        ]' ->> '$[0].scores';

Resultat:

[9,7,3]

Vi kan gå endnu dybere og udtrække en bestemt score:

SELECT '[
        { 
        "user" : "Spike",
        "age" : 30,
        "scores" : [ 9, 7, 3 ]
        },
        { 
        "user" : "Faye",
        "age" : 25,
        "scores" : [ 90, 87, 93 ]
        },
        { 
        "user" : "Jet",
        "age" : 40,
        "scores" : [ 50, 38, 67 ]
        }
        ]' ->> '$[0].scores[1]';

Resultat:

7

Ikke-eksisterende sti

Hvis stien ikke findes i JSON, returneres en null-værdi:

SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.age';

Resultat:

null

Bemærk, at I SQLite kan du bruge .nullvalue for at angive en streng, der skal udlæses, når en nulværdi returneres. I mit tilfælde havde jeg tidligere kørt følgende kommando:

.nullvalue null

Det angiver, at teksten null skal udlæses, hver gang en nulværdi returneres. Det er grunden til, at ovenstående eksempel udskriver teksten null . Hvis jeg ikke havde gjort dette, kunne resultatet have været tomt.

Ugyldig JSON

Hvis det første argument ikke er gyldigt JSON, vises en fejl:

SELECT '{ "name" }' ->> '$';

Resultat:

Runtime error: malformed JSON

Ugyldig sti

Og hvis det andet argument ikke er en gyldig sti, vises en fejl:

SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$name';

Resultat:

Runtime error: JSON path error near 'name'

I dette tilfælde glemte jeg at inkludere punktum (. ) mellem dollartegnet ($ ) og navn .

Men som nævnt er det muligt helt at udelade dollartegnet og punktum:

SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> 'name';

Resultat:

Wag

  1. Kaldning af en Oracle-procedure med en PL/SQL-opsamlingstypeparameter via .NET

  2. Oracle PL/SQL:UTL_FILE.FCOPY Eksempel

  3. Hvordan CONCAT_WS() virker i MariaDB

  4. Rekursiv forespørgsel i SQL Server