web-dev-qa-db-fra.com

Interroger une colonne JSON avec un tableau d'objets dans MySQL

J'ai une colonne json avec le tableau suivant:

[
  {
    "id": "24276e4b-de81-4c2c-84e7-eed9c3582a31",
    "key": "id",
    "type": "input",
  },
  {
    "id": "e0ca5aa1-359f-4460-80ad-70445be49644",
    "key": "name",
    "type": "textarea",
    }
]

J'ai essayé la requête suivante pour obtenir la ligne qui a l'ID 24276e4b-de81-4c2c-84e7-eed9c3582a31 dans la colonne du document, mais il ne renvoie aucun résultat:

select * from jobs WHERE document->'$[*].id' = "24276e4b-de81-4c2c-84e7-eed9c3582a31"

Quelqu'un sait comment faire la bonne requête?

18
Fabrício

J'utilise mysql 5.7 et donc JSON_CONTAINS peut être facilement utilisé comme ceci:

SELECT JSON_CONTAINS(
                '[{"id": "24av","name": "she"},{"id": "e0c2", "name": "another_she"}]', 
                JSON_OBJECT('id', "e0c2")
                );
23
Sep

Essayez comme ceci:

SELECT * FROM jobs WHERE document->'$[*].id' = json_array("24276e4b-de81-4c2c-84e7-eed9c3582a31");

ça marche pour moi, et je pense que le coup est plus réussi:

SELECT * FROM jobs WHERE json_contains(document->'$[*].id', json_array("24276e4b-de81-4c2c-84e7-eed9c3582a31"));

En fait, il est facile de se rappeler que la valeur de retour est JSON_TYPE mais pas une chaîne ou autre chose;

6
Mr.Sheng

peut être ça? @Barmar

SELECT * FROM jobs WHERE JSON_SEARCH(document, "one", "24276e4b-de81-4c2c-84e7-eed9c3582a31", NULL, '$[*].id') IS NOT NULL;
0
GeekLei

Lorsque vous utilisez document->'$[*].id', Il renvoie une liste séparée par des virgules de toutes les propriétés d'ID. Ce ne sera pas égal à la valeur d'une seule chaîne d'ID, sauf s'il n'y a qu'un seul objet dans la colonne document.

Vous devez utiliser JSON_SEARCH() pour rechercher un élément correspondant dans la valeur JSON.

SELECT * 
FROM jobs 
WHERE JSON_SEARCH(document, "one", "24276e4b-de81-4c2c-84e7-eed9c3582a31", NULL, '$[*].id');
0
Barmar