Le tableau ressemble à ceci:
SELECT * FROM my_table
WHERE meta_data LIKE '\{\"my property\"\: \"123\"\}';
J'ai essayé d'interroger avec:
SELECT * FROM my_table
WHERE meta_data = '{"my property": "123"}';
SELECT * FROM my_table
WHERE meta_data = '\{\"my property\"\: \"123\"\}';
Et cela ne fonctionne pas, comment Je demande une correspondance exacte sur une chaîne de champ json?
J'ai remarqué que cela fonctionne ...
my_table
id (int) create_time (timestamp) meta_data (json)
1 2019-01-20 18:35:42 {"my property": "123"}
2 2019-01-20 19:35:42 {"more data": "456"}
Dois-je utiliser LIKE ? Pourquoi = ne fonctionne pas?
5 Réponses :
Vous devriez renvoyer ceci https://dev.mysql.com/doc/ refman / 5.7 / fr / json-search-functions.html
pour utiliser les données JSON pour la requête
N'ajoutez pas de lien uniquement des réponses. Copiez les informations importantes
Utilisez JSON_CONTAINS:
SELECT * FROM my_table WHERE JSON_CONTAINS(meta_data, '"123"', '.$"my property"');
Notes :
ma propriété est une chaîne littérale, nous devons également rechercher les guillemets doubles. ma propriété dans le chemin JSON, nous pouvons l'échapper en utilisant des guillemets doubles. Essayez (modifiez en fonction du nom correct de la propriété et du type de données. Si la chaîne utilise "123".
SELECT * FROM my_table WHERE JSON_EXTRACT(meta_data, "$.my property")= 123
Ou peut-être
SELECT * FROM my_table WHERE JSON_EXTRACT(meta_data, "$.`my property`")= 123
Je sais que le champ JSON est un type de champ spécial qui est conçu pour vous permettre d'interroger facilement des propriétés spécifiques, mais je voulais pouvoir simplement vérifier le JSON complet facilement. Et il est clair que le champ JSON a des paramètres qui empêchent le = de fonctionner comme prévu.
C'est la solution que j'ai trouvée, transtypez JSON en CHAR :
SELECT * FROM my_table
WHERE meta_data = CAST('{"my property": "123"}' AS JSON);
Une autre option:
SELECT * FROM my_table
WHERE CAST(meta_data as CHAR) = '{"my property": "123"}';
Vous pouvez également obtenir des valeurs JSON en convertissant des valeurs d'autres types en type JSON à l'aide de CAST (valeur AS JSON); " https: //dev.mysql. com / doc / refman / 5.7 / fr / json-creation-functions.html # function_json-quote
Bien que cela puisse répondre à votre question immédiate, ce n'est pas optimal, du moins du point de vue qu'il ne s'adapte pas bien à mesure que la complexité de votre chaîne JSON augmente.
merci beaucoup pour cette réponse. Je suis d'accord que ce n'est pas l'idéal, mais cela me permet de surmonter le problème en ce moment. Pourquoi pensez-vous que votre deuxième option est meilleure? @TimBiegeleisen existe-t-il une meilleure option disponible? Je pense que je devrai peut-être soulever cela dans les forums MySQL s'il n'y en a pas.
@AndrewBrown Je ne sais pas pourquoi je pensais que la deuxième option était meilleure, probablement uniquement une question de préférence pour savoir si vous devez convertir les données d'origine ou les données avec lesquelles vous les comparez. Et si vous devez convertir l'original en caractère / chaîne, ou convertir les données de comparaison en JSON (le type de données de l'original)
La deuxième option permet à la base de données d'effectuer la correspondance d'une manière indépendante de l'ordre des touches. La première option échouait s'il y avait plus d'une clé dans l'objet et que la représentation sous forme de chaîne les avait dans un ordre différent.
Si vous souhaitez comparer une colonne JSON à une valeur JSON, utilisez JSON_OBJECT () pour créer la valeur.
Démo:
create table t (id int primary key, data json);
insert into t values (1, json_object('my property', '123'));
insert into t values (2, json_object('more_data', 456));
select * from t where data = json_object('more_data', 456);
+----+--------------------+
| id | data |
+----+--------------------+
| 2 | {"more_data": 456} |
+----+--------------------+