[MySQL] Extraction de champs Json

Extraction de champs Json [MySQL] - SQL/NoSQL - Programmation

Marsh Posté le 02-08-2019 à 15:23:01    

Bonjour,
 
J'ai dans une table un champs de type Json formaté comme ceci:
 

Code :
  1. {"Intitule":{"name":"Intitule","stats":false,"is_array":false,"is_filter":true,"chart":"pie","col":"6"},"Fin":{"name":"Date de fin","stats":false,"is_array":false,"is_filter":false,"chart":"pie","col":"6"}


 
Ma question est: quelle requête dois-je faire pour "extraire" les noms des clés (ici représenté "Intitule" et "Fin" ), le "name" de chacune, pour celle qui ont comme valeur "is_filters=true".
 
Je tourne en rond depuis quelque temps sans parvenir à trouver une solution…
Par avance merci! :)

Reply

Marsh Posté le 02-08-2019 à 15:23:01   

Reply

Marsh Posté le 02-08-2019 à 15:40:34    

Pas évident, le JSON n'étant pas un format ou l'ordre des clef/valeur est prédictible, tu ne peux même pas faire un LIKE ('%Intitule%"is_filter":true%') sur une colonne en FULLTEXT, ni même une REGEX (qui serait de toute façon catastrophique en terme de perf)...
 
Regardes du coté de https://dev.mysql.com/doc/refman/5. [...] on-extract si tu peux trouver ton bonheur.


---------------
D3
Reply

Marsh Posté le 06-08-2019 à 14:33:52    

Après, est-ce une bonne idée de stocker du json en base si on veut en extraire des données ? Pourquoi ne pas avoir créé une table dédiée avec les colonnes "name", "stats", "is_array", ... et éventuellement une colonne "cle" prenant la valeur "Intitule" et "Fin" et ne pas l'avoir remplie avec les données de ce JSON ?

Message cité 1 fois
Message édité par Harkonnen le 06-08-2019 à 14:36:03

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 06-08-2019 à 15:34:56    

Harkonnen a écrit :

Après, est-ce une bonne idée de stocker du json en base si on veut en extraire des données ? Pourquoi ne pas avoir créé une table dédiée avec les colonnes "name", "stats", "is_array", ... et éventuellement une colonne "cle" prenant la valeur "Intitule" et "Fin" et ne pas l'avoir remplie avec les données de ce JSON ?


 
Ça peut être utile quand t'es face à des données dont la forme n'est pas forcément prévisible, ou que ces données augmenteraient significativement la complexité de ta base en utilisant l'approche traditionnelle.
 
Y'a pas mal de cas d'utilisations pour ça.

Reply

Marsh Posté le 06-08-2019 à 15:42:06    

:jap:
 
Reste à savoir si c'est le cas pour Furaxx


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 17-08-2019 à 08:46:24    

à coeur vaillant, rien d'impossible  ;)  
 
stoker du json n'est certes pas très ingénieux, mais c'est fait :D
 

Code :
  1. select
  2.         @pos1 := locate('{', fields,position('{' in fields)+1) as pos1,
  3.         @pos2 := locate('}',fields) as pos2,
  4.         @pos3 := locate('{',fields, @pos2+1) as pos3,
  5.         @pos4 := locate('}',fields, @pos3+1) as pos4,
  6.         substr(fields,@pos1,@pos2) as   intitule,
  7.         substr(fields,@pos3,@pos4) as   fin
  8. from planningbe.test_json
  9. having intitule like '%"stats":true%';


 
Voilà comment extraire de "intituler" tous les "stats":true ;)
 
la table comprend près de 200 000 enreg, pour en extraire les plus 32 000 il faut 1.4 sec, question perfs, c'est pas si dramatique ce ça :D :D
 
 
@pluche
 
Pierre


Message édité par pierrot_77 le 17-08-2019 à 08:48:44
Reply

Marsh Posté le 21-08-2019 à 14:58:26    

Bonjour,
 
Désolé pour mon absence, vacances, tout ça… :)
 
Pour répondre à une question posée, je suis en effet dans le cas où le nombre de champs ainsi que certains noms peuvent être amener à changer d'un enregistrement à l'autre. Créer un champs pour chacun ne serait donc pas pratique du tout.
J'étais au départ parti sur cette solution, et je me suis rabattu sur le JSon ensuite au vue des soucis que ça posait.
 
Le truc Pierrot_77 c'est que avec ta requête on part du principe qu'on connait déjà les noms de clés (ici "intitule" et "fin" ), mais ce ne sera pas forcément le cas, vu que ces clés en question peuvent changer d'un enregistrement à l'autre (j'ai un cas où il n'y a pas "fin" par exemple).
 
J'ai posé la question sur Stackoverflow et une personne m'a répondu avec une requête qui fonctionne (je devrai attendre de revenir au boulot pour retrouver la page en question), c'est une requête à rallonge qui fonctionne, mais qui montre bien comme vous le dites que stocker sous forme JSon n'est pas vraiment une bonne solution… Suf que là je ne voyais pas trop comment faire autrement.
 
Je mettrai à jour ce message dès que j'aurai récupéré la requête en question.
 
En tout cas merci! :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed