web-dev-qa-db-fra.com

Comment rechercher un tableau JSON dans MySQL?

Disons que j'ai une colonne JSON nommée data dans une table MySQL, et que cette colonne est un simple array. Ainsi, par exemple, les données peuvent contenir:

[1,2,3,4,5]

Maintenant, je veux sélectionner toutes les lignes qui ont une colonne de données où l'un de ses éléments de tableau est supérieur à 2. Est-ce possible?

J'ai essayé ce qui suit, mais il semble que ce soit toujours true quelles que soient les valeurs du tableau:

SELECT * from my_table
WHERE JSON_EXTRACT(data, '$[*]') > 2;
19
Loai Ghoraba
SELECT JSON_SEARCH('["1","2","3","4","5"]', 'one', "2") is not null 

est vrai

SELECT JSON_SEARCH('["1","2","3","4","5"]', 'one', "6") is not null

c'est faux

7
JONG MIN IM

Une solution possible consiste à traiter le problème sous forme de correspondance de chaîne. Convertissez le JSON en chaîne et en correspondance.

Ou vous pouvez utiliser JSON_CONTAINS .

2
Mohamed Gad-Elrab

Depuis MySQL 8 , une nouvelle fonction appelée JSON_TABLE .

CREATE TABLE my_table (id INT, data JSON);

INSERT INTO my_table VALUES 
  (1, "[1,2,3,4,5]"), 
  (2, "[0,1,2]"), 
  (3, "[3,4,-10]"), 
  (4, "[-1,-2,0]");

SELECT DISTINCT my_table.* 
FROM my_table, JSON_TABLE(data, "$[*]" COLUMNS(nr INT PATH '$')) as ids 
WHERE ids.nr > 2;

+------+-----------------+
| id   | data            |
+------+-----------------+
|    1 | [1, 2, 3, 4, 5] |
|    3 | [3, 4, -10]     |
+------+-----------------+
2 rows in set (0.00 sec)
1
user2458995

Je ne sais pas si nous avons trouvé la solution… .. J'ai trouvé avec MariaDB un moyen de rechercher un chemin dans un tableau. Par exemple, dans le tableau [{"id": 1}, {"id": 2}], je veux trouver le chemin avec un identifiant égal à 2. 

SELECT JSON_SEARCH('name_field', 'one', 2, null, '$[*].id')
FROM name_table

Le résultat est:

"$[1].id"

L'astérisque indique une recherche dans tout le tableau

1
Carlos 2V

Vous pouvez utiliser un extrait JSON pour rechercher et sélectionner des données.

SELECT data, data->"$.id" as selectdata
FROM table
WHERE JSON_EXTRACT(data, "$.id") = '123'
#ORDER BY c->"$.name";
limit 10 ;
1
Justin