6 votes

MySQL 5.7 : convertir un simple JSON_ARRAY en lignes

J'ai une table simple avec une colonne JSON_ARRAY comme celle-ci :

+----+---------+
| id | content |
+----+---------+
|  1 | [3, 4]  |
|  2 | [5, 6]  |
+----+---------+

Je veux lister toutes les références de contenu pour un identifiant spécifique.

SELECT JSON_EXTRACT(content, '$') as res FROM table WHERE id=1

Mais j'aimerais que le résultat soit en lignes :

+-----+
| res |
+-----+
|  3  |
|  4  |
+-----+

9voto

Bill Karwin Points 204877

Vous pouvez le faire dans MySQL 8.0 avec JSON_TABLE() :

select r.res from mytable, 
 json_table(mytable.content, '$[*]' columns (res int path '$')) r 
where mytable.id = 1

J'ai testé sur MySQL 8.0.17, et voici le résultat :

+------+
| res  |
+------+
|    3 |
|    4 |
+------+

Si vous utilisez une version antérieure à MySQL 8.0, vous avez les options suivantes :

  • Trouver une solution SQL incroyablement complexe. C'est presque toujours la mauvaise façon de résoudre le problème, car vous vous retrouvez avec un code trop coûteux à maintenir.
  • Récupérer le tableau JSON tel quel et l'exploser dans le code de l'application.
  • Normalisez vos données afin d'avoir une valeur par ligne, au lieu d'utiliser des tableaux JSON.

Je trouve souvent sur Stack Overflow des questions sur l'utilisation de JSON dans MySQL qui me convainquent que cette fonctionnalité a ruiné MySQL. Les développeurs continuent à l'utiliser de manière inappropriée. Ils apprécient le fait qu'il soit facile de insérer des données semi-structurées, mais ils constatent qu'il est interrogation que les données sont beaucoup trop complexes.

0voto

Jibeji Points 93

C'était une mauvaise idée. Je vais faire un json_decode() avec PHP pour résoudre ce problème. Merci à tous.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X