sql >> Database >  >> RDS >> MariaDB

MariaDB JSON_SEARCH() uitgelegd

In MariaDB, JSON_SEARCH() is een ingebouwde functie waarmee u het pad naar een bepaalde waarde in een JSON-document kunt krijgen.

Het accepteert het JSON-document en een tekenreeks als argumenten en retourneert het pad naar de opgegeven tekenreeks in het document.

Syntaxis

De syntaxis gaat als volgt:

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

Waar:

  • json_doc is het JSON-document en search_str is de tekenreeks.
  • return_arg is het sleutelwoord one of all . Als u one . gebruikt , wordt alleen het eerste pad geretourneerd. Alle andere gebeurtenissen worden genegeerd. Welk pad als "eerste" wordt beschouwd, is niet gedefinieerd (volgens de MariaDB-documentatie). Als all is opgegeven, worden de paden van alle exemplaren geretourneerd. Als er meerdere paden zijn, worden ze automatisch ingepakt als een array.
  • De escape_char argument is een optioneel teken om als escape-teken te gebruiken.
  • Het path argument is een optioneel argument om te bepalen waar het pad op het hoogste niveau begint in het JSON-document.

Voorbeeld

Hier is een voorbeeld om te demonstreren:

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

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

Resultaat:

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

Hier is een voorbeeld van het retourneren van het pad voor een element in een array:

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

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

Resultaat:

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

Arrays zijn gebaseerd op nul, en dus $.sizes[1] verwijst naar het tweede element in de array.

Meerdere gebeurtenissen

Als u alle paden wilt retourneren die de tekenreeks bevatten, gebruikt u all in plaats van one voor het tweede 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');

Resultaat:

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

Als we all veranderen naar one , dit is wat er gebeurt:

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

Resultaat:

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

Er wordt slechts één pad geretourneerd.

Geef een pad op

Hier is een voorbeeld dat een pad specificeert waarnaar in het document moet worden gezocht:

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;

Resultaat:

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

In dit geval is de string dog komt eigenlijk drie keer voor in het document, maar slechts twee keer onder het opgegeven pad.

We gebruikten ook NULL voor het escape-tekenargument, wat ertoe leidt dat het standaard escape-teken wordt gebruikt, namelijk de backslash (\ ).

Standaard Escape-teken

Het escape-teken is standaard een backslash (\ ).

Voorbeeld:

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";

Resultaat:

+--------------------------------------+------------+
| Not Escaped                          | Escaped    |
+--------------------------------------+------------+
| ["$[0].pwd", "$[1].pwd", "$[2].pwd"] | "$[0].pwd" |
+--------------------------------------+------------+

Het procentteken (% ) is een jokerteken dat overeenkomt met een willekeurig aantal tekens. Daarom, als we er niet aan ontsnappen, zal het overeenkomen met een willekeurig aantal tekens, inclusief tekens die geen percentagetekens zijn.

Maar wanneer we ontsnappen aan het percentageteken met het escape-teken, komt het alleen overeen als er precies één procentteken op die locatie staat.

De bovenstaande resultaten weerspiegelen dit.

Geef een aangepast escape-teken op

U kunt indien nodig een aangepast escape-teken opgeven. Om dit te doen, geeft u het op als het vierde argument.

Voorbeeld:

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";

Resultaat:

+--------------------------------------+------------+
| Not Escaped                          | Escaped    |
+--------------------------------------+------------+
| ["$[0].pwd", "$[1].pwd", "$[2].pwd"] | "$[0].pwd" |
+--------------------------------------+------------+

We krijgen dus hetzelfde resultaat als in het vorige voorbeeld. Het enige verschil is dat we een ander escape-teken hebben opgegeven. In dit geval hebben we gespecificeerd dat het uitroepteken (! ) is het escape-teken.

Nullargumenten

Als een van de zoektekenreeksen, zoekreeksen of padargumenten NULL . is , het resultaat is 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;

Resultaat:

+------+------+------+
| a    | b    | c    |
+------+------+------+
| NULL | NULL | NULL |
+------+------+------+

Onjuist aantal parameters

Het verstrekken van geen argumenten resulteert in een fout:

SELECT JSON_SEARCH();

Resultaat:

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_SEARCH'

Hetzelfde geldt als je te weinig argumenten geeft:

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

Resultaat:

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_SEARCH'

  1. Beste manier om te controleren op lege of null-waarde

  2. Dubbelzinnige kolomnaamfout op een bepaalde server

  3. Hoe de RIGHT()-functie werkt in SQL Server (T-SQL)

  4. Hoe een XML-bestand in de MySQL-databasetabel te importeren met XML_LOAD(); functie