= SQL JSON
== diccionario
Extraer información de JSON almacenado en campo SQL:SELECT id,JSON_EXTRACT(valor,'$.periode') AS periode
FROM treballadors_registrejornada
WHERE periode = "01-2020"
SELECT id FROM treballadors_registrejornada
WHERE valor->>'$.periode' = '01-2020';
{{ :bbdd:sql:pasted:20230109-025759.png }}
* https://noticiasseguridad.com/seguridad-informatica/los-nuevos-ataques-de-inyeccion-sql-basados-en-json-permiten-eludir-waf-de-palo-alto-f5-aws-cloudflare-e-imperva/
* https://dev.mysql.com/doc/refman/8.0/en/json-functions.html
== lista
["01-2020", "02-2020", "03-2020"]
-- Extrae el primer elemento de la lista
SELECT id, JSON_EXTRACT(valor, '$[0]') AS primer_periodo
FROM treballadors_registrejornada;
-- Devuelve solo las filas donde "01-2020" esté dentro de la lista
SELECT id FROM treballadors_registrejornada
WHERE JSON_CONTAINS(valor, '"01-2020"');
-- Eliminar un elemento por su posición
SELECT id, JSON_LENGTH(valor) AS total_periodos
FROM treballadors_registrejornada;
-- Eliminar un elemento por su posición
UPDATE treballadors_registrejornada
SET valor = JSON_ARRAY_APPEND(valor, '$', '04-2020') WHERE id = 1;
-- nsertar en una posición específica (ej. en la posición 1)
SET valor = JSON_ARRAY_INSERT(valor, '$[1]', '01-2021')
-- Eliminar un elemento por su posición
SET valor = JSON_REMOVE(valor, '$[0]') -- Borra el primer elemento
-- De Lista JSON a Filas SQL
SELECT t.id, j.periode
FROM treballadors_registrejornada t
CROSS JOIN JSON_TABLE(
t.valor,
'$[*]' COLUMNS (
periode VARCHAR(20) PATH '$'
)
) AS j
WHERE j.periode = "01-2020";