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

MariaDB JSON_SEARCH() Forklaret

I MariaDB, JSON_SEARCH() er en indbygget funktion, der giver dig mulighed for at få stien til en given værdi i et JSON-dokument.

Den accepterer JSON-dokumentet og en streng som argumenter og returnerer stien til den givne streng i dokumentet.

Syntaks

Syntaksen ser sådan ud:

JSON_SEARCH(
    json_doc, 
    return_arg, 
    search_str[, escape_char[, path] ...]
    ) 

Hvor:

  • json_doc er JSON-dokumentet og search_str er strengen.
  • return_arg er søgeordet one eller all . Hvis du bruger one , kun den første sti returneres. Alle andre hændelser ignoreres. Hvilken sti, der betragtes som "først", er udefineret (ifølge MariaDB-dokumentationen). Hvis all er angivet, returneres stierne til alle forekomster. Hvis der er flere stier, pakkes de automatisk som en matrix.
  • escape_char argument er et valgfrit tegn, der skal bruges som et escape-tegn.
  • path argument er et valgfrit argument til at bestemme, hvor "top-level"-stien starter i JSON-dokumentet.

Eksempel

Her er et eksempel til demonstration:

SET @json = '
    { 
        "name" : "Wag", 
        "type" : "Dog" 
    }';

SELECT JSON_SEARCH(@json, 'one', 'Wag'); 

Resultat:

+----------------------------------------+| JSON_SEARCH(@json, 'one', 'Wag') |+----------------------------------------+ | "$.name" |+-----------------------------------------+

Her er et eksempel på returnering af stien for et element i en matrix:

SET @json = '
    { 
        "product" : "Left Handed Screwdriver", 
        "sizes" : [ "Small", "Medium", "Large" ],
    }';

SELECT JSON_SEARCH(@json, 'one', 'Medium'); 

Resultat:

+--------------------------------------------+| JSON_SEARCH(@json, 'one', "Medium") |+---------------------------------------- --+| "$.størrelser[1]" |+--------------------------------------------+ 

Arrays er nul-baserede, og så $.sizes[1] henviser til det andet element i arrayet.

Flere forekomster

Hvis du vil returnere alle stier, der indeholder strengen, skal du bruge all i stedet for one for det andet argument.

SET @json = '[
    { "name": "Wag", "type": "Dog", "weight": 20 },
    { "name": "Bark", "type": "Dog", "weight": 10 },
    { "name": "Meow", "type": "Cat", "weight": 7 }
]';

SELECT JSON_SEARCH(@json, 'all', 'Dog'); 

Resultat:

+----------------------------------------+| JSON_SEARCH(@json, 'alle', "Hund") |+----------------------------------------+ | ["$[0].type", "$[1].type"] |+---------------------------------------- -----+

Hvis vi ændrer all til one , her er hvad der sker:

SET @json = '[
    { "name": "Wag", "type": "Dog", "weight": 20 },
    { "name": "Bark", "type": "Dog", "weight": 10 },
    { "name": "Meow", "type": "Cat", "weight": 7 }
]';

SELECT JSON_SEARCH(@json, 'one', 'Dog'); 

Resultat:

+----------------------------------------+| JSON_SEARCH(@json, 'en', "Hund") |+----------------------------------------+ | "$[0].type" |+----------------------------------------+

Kun én sti returneres.

Angiv en sti

Her er et eksempel, der specificerer en sti, som der skal søges efter i dokumentet:

SET @json = '
    { 
        "_id" : 1, 
        "name" : "Wag", 
        "details" : {
            "type" : "Dog", 
            "weight" : 20,
            "awards" : { 
                "NZ Dog Award" : "Top Dog", 
                "New York Marathon" : "Fastest Animal", 
                "Sumo 2021" : "Biggest Dog"
            }
        }
    }
';
SELECT JSON_SEARCH(
    @json, 
    'all',
    '%dog%',
    NULL,
    '$.details.awards'
    ) AS Result; 

Resultat:

+---------------------------------------------- -------------------+| Resultat |+----------------------------------------------- ------------------+| ["$.details.awards.NZ Dog Award", "$.details.awards.Sumo 2021"] |+------------------------ ------------------------------------------+

I dette tilfælde er strengen dog forekommer faktisk tre gange i dokumentet, men kun to gange under den angivne sti.

Vi brugte også NULL for escape-tegnargumentet, hvilket resulterer i, at standard escape-tegnet bliver brugt, som er omvendt skråstreg (\ ).

Standard Escape-tegn

Som standard er escape-tegnet en omvendt skråstreg (\ ).

Eksempel:

SET @json = '[
    { "uid": "Wag", "pwd": "my%pwd" },
    { "uid": "Bark", "pwd": "my%%%pwd" },
    { "uid": "Bark", "pwd": "myBIGpwd" }
]';

SELECT 
    JSON_SEARCH(@json, 'all', 'my%pwd') AS "Not Escaped",
    JSON_SEARCH(@json, 'all', 'my\%pwd') AS "Escaped"; 

Resultat:

+---------------------------------------------+------- -----+| Ikke undsluppet | Undsluppet |+----------------------------------------------+-------- ----+| ["$[0].pwd", "$[1].pwd", "$[2].pwd"] | "$[0].pwd" |+---------------------------------------------+- -----------+

Procenttegnet (% ) er et jokertegn, der matcher et vilkårligt antal tegn. Derfor, hvis vi ikke undslipper det, vil det matche et hvilket som helst antal tegn, inklusive tegn, der ikke er procenttegn.

Men når vi escaper procenttegnet med escape-tegnet, vil det kun matche, når der er præcis ét procenttegn på den placering.

Ovenstående resultater afspejler dette.

Angiv et tilpasset escape-tegn

Du kan angive et brugerdefineret escape-tegn, hvis det kræves. For at gøre dette skal du angive det som det fjerde argument.

Eksempel:

SET @json = '[
    { "uid": "Wag", "pwd": "my%pwd" },
    { "uid": "Bark", "pwd": "my%%%pwd" },
    { "uid": "Bark", "pwd": "myBIGpwd" }
]';

SELECT 
    JSON_SEARCH(@json, 'all', 'my%pwd', '!') AS "Not Escaped",
    JSON_SEARCH(@json, 'all', 'my!%pwd', '!') AS "Escaped"; 

Resultat:

+---------------------------------------------+------- -----+| Ikke undsluppet | Undsluppet |+----------------------------------------------+-------- ----+| ["$[0].pwd", "$[1].pwd", "$[2].pwd"] | "$[0].pwd" |+---------------------------------------------+- -----------+

Så vi får det samme resultat som i det foregående eksempel. Den eneste forskel er, at vi specificerede en anden escape-karakter. I dette tilfælde specificerede vi, at udråbstegn (! ) er escape-karakteren.

Nul-argumenter

Hvis nogen af ​​søgestrengen, søgestrengen eller sti-argumenterne er NULL , resultatet er NULL :

SELECT 
    JSON_SEARCH(null, 'all', 's', '', '$') AS a,
    JSON_SEARCH('{"a":1}', 'all', null, '', '$') AS b,
    JSON_SEARCH('{"a":1}', 'all', 's', '', null) AS c; 

Resultat:

+------+------+------+| en | b | c |+------+------+------+| NULL | NULL | NULL |+------+------+------+

Forkert parameterantal

Angivelse af ingen argumenter resulterer i en fejl:

SELECT JSON_SEARCH(); 

Resultat:

FEJL 1582 (42000):Forkert parameterantal i kaldet til den oprindelige funktion 'JSON_SEARCH'

Det er det samme, når du giver for få argumenter:

SELECT JSON_SEARCH('{"a":1}', 'all'); 

Resultat:

FEJL 1582 (42000):Forkert parameterantal i kaldet til den oprindelige funktion 'JSON_SEARCH'

  1. Hvordan forbinder jeg sql-server med php ved hjælp af xampp?

  2. Brug af SQL Server Profiler | SQL Server Performance Fejlfinding -5

  3. Kan ikke installere pg gem i Mavericks med Postgres.app

  4. Hvordan kan jeg fremskynde en MySQL-forespørgsel med en stor offset i LIMIT-klausulen?