web-dev-qa-db-fra.com

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":""
}}
33
reza

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

51
Sachin Vairagi
  1. 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.

  2. 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/

  3. Le modèle correct est: 

    WHERE  `attribs_json` REGEXP '"1":{"value":[^}]*"3"[^}]*}'
    

    [^}] correspond à n'importe quel caractère sauf }

11
Naktibalda

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)
8
Vishnu Prasanth G

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.

5
Valentino

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`;
0
0x00