json_extract - select json mysql 8
¿Cómo buscar la matriz JSON en MySQL? (5)
Digamos que tengo una columna JSON llamada data en alguna tabla MySQL, y esta columna es una matriz única. Así, por ejemplo, los datos pueden contener:
[1,2,3,4,5]
Ahora quiero seleccionar todas las filas que tienen una columna de datos donde uno de sus elementos de matriz es mayor que 2. ¿Es esto posible?
Intenté lo siguiente, pero parece que siempre es cierto, independientemente de los valores de la matriz:
SELECT * from my_table
WHERE JSON_EXTRACT(data, ''$[*]'') > 2;
No sé si encontramos la solución. Encontré con MariaDB una forma de buscar la ruta en una matriz. Por ejemplo, en la matriz [{"id": 1}, {"id": 2}], quiero encontrar la ruta con id igual a 2.
SELECT JSON_SEARCH(''name_field'', ''one'', 2, null, ''$[*].id'')
FROM name_table
El resultado es:
"$[1].id"
El asterisco indica buscar en todo el conjunto.
Puedes usar el extracto de JSON para buscar y seleccionar datos
SELECT data, data->"$.id" as selectdata
FROM table
WHERE JSON_EXTRACT(data, "$.id") = ''123''
#ORDER BY c->"$.name";
limit 10 ;
Una forma posible es tratar el problema como una coincidencia de cadenas. Convertir el JSON a cadena y coincidencia.
O puedes usar dev.mysql.com/doc/refman/5.7/en/json-search-functions.html .
Desde MySQL 8 hay una nueva función llamada 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)
SELECT JSON_SEARCH(''["1","2","3","4","5"]'', ''one'', "2") is not null
es verdad
SELECT JSON_SEARCH(''["1","2","3","4","5"]'', ''one'', "6") is not null
Es falso