Comment rechercher des données JSON dans MySQL?
J'insère mes données dans une base de données avec json_encoded
. Maintenant, je veux chercher dans "fonctionnalité", mais je ne peux pas.
Requête MySQL:
SELECT `id` , `attribs_json`
FROM `products`
WHERE `attribs_json` REGEXP '"1":{"value":[^"3"$]'
Cette requête me montre toutes les lignes avec la clé "1" et la valeur est n'importe quoi, la valeur est "3"
Mes données sont:
{"feature":{"1":{"value":"["2","3"]"},
"2":{"value":["1"]},
"5":{"value":""},
"3":{"value":["1"]},
"9":{"value":""},
"4":{"value":"\u0633\u0627\u062a\u0646"},
"6":{"value":""},
"7":{"value":""},
"8":{"value":""}
},
"show_counter":"0",
"show_counter_discount":""
}}
Si vous avez version de MySQL> = 5.7, vous pouvez essayer ceci:
SELECT JSON_EXTRACT(name, "$.id") AS name
FROM table
WHERE JSON_EXTRACT(name, "$.id") > 3
Sortie:
+-------------------------------+
| name |
+-------------------------------+
| {"id": "4", "name": "Betty"} |
+-------------------------------+
Veuillez consulter le manuel de référence MySQL pour plus de détails:
https://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html
Stocker JSON dans la base de données enfreint la première forme normale.
La meilleure chose à faire est de normaliser et de stocker les fonctionnalités dans une autre table. Vous pourrez alors utiliser une requête beaucoup plus esthétique et performante avec des jointures . Votre JSON ressemble même à la table.
Mysql 5.7 a une fonctionnalité JSON intégrée:
http://mysqlserverteam.com/mysql-5-7-lab-release-json-functions-part-2-querying-json-data/Le modèle correct est:
WHERE `attribs_json` REGEXP '"1":{"value":[^}]*"3"[^}]*}'
[^}]
correspond à n'importe quel caractère sauf}
Si vous utilisez MySQL, la version la plus récente peut vous aider à répondre à vos besoins.
select * from products where attribs_json->"$.feature.value[*]" in (1,3)
J'utilise cette requête
SELECT id FROM table_name WHERE field_name REGEXP '"key_name":"([^"])key_Word([^"])"';
or
SELECT id FROM table_name WHERE field_name RLIKE '"key_name":"[[:<:]]key_Word[[:>:]]"';
La première requête que je l'utilise pour rechercher une valeur partielle. La deuxième requête je l'utilise pour rechercher le mot exact.
pour MySQL tous (et 5.7)
SELECT LOWER(TRIM(BOTH 0x22 FROM TRIM(BOTH 0x20 FROM SUBSTRING(SUBSTRING(json_filed,LOCATE('\"ArrayItem\"',json_filed)+LENGTH('\"ArrayItem\"'),LOCATE(0x2C,SUBSTRING(json_filed,LOCATE('\"ArrayItem\"',json_filed)+LENGTH('\"ArrayItem\"')+1,LENGTH(json_filed)))),LOCATE(0x22,SUBSTRING(json_filed,LOCATE('\"ArrayItem\"',json_filed)+LENGTH('\"ArrayItem\"'),LOCATE(0x2C,SUBSTRING(json_filed,LOCATE('\"ArrayItem\"',json_filed)+LENGTH('\"ArrayItem\"')+1,LENGTH(json_filed))))),LENGTH(json_filed))))) AS result FROM `table`;