Comparar valores con array de datos JSON en MySQL

Supongamos que tenemos en una tabla una columna a_productIds de tipo JSON que contiene un array de números y queremos listar los registros que tienen en esa columna algún valor de una lista de números.

La forma más sencilla que he encontrado es usar la función JSON_OVERLAPS que recibe dos documentos JSON y devuelve 1 si tienen en común algún par clave-valor o elemento de array (esto es lo que nos interesa aquí).

Si queremos listar los registros que tienen en a_productIds alguno de los valores 1, 2 o 3 la consulta quedaría así:

SELECT * 
  FROM tabla 
 WHERE JSON_OVERLAPS(JSON_EXTRACT(a_productIds, '$'), '[1, 2, 3]');

En ocasiones quizá necesitemos localizar arrays vacíos, esto puede hacerse con la función JSON_LENGTH:

SELECT * 
  FROM tabla 
 WHERE JSON_LENGTH(a_productIds, '$') = 0;

Letras gordotas para los minimapas de los IDEs

El minimapa que muchos IDEs muestran a la derecha de un fichero abierto resulta bastante útil.

Y en esta página web podemos generar texto en letras goooordas (yo uso la fuente ANSI regular).

El resultado es que podemos usar estas letras gordas para dejar indicaciones visuales en el minimapa de dónde empiezan ciertas secciones. La imagen del ejemplo es de un fichero donde defino los filtros que pueden usarse en diferentes tablas de datos en una aplicación web.

Cambiar la ordenación de fechas NULL en MySQL

Al ordenar por un campo de fecha los campos NULL se consideran menores que cualquier fecha definida.

Supongamos que tenemos una tabla con tres fechas: 1-1-2020, 1-1-2021 y NULL. Ordenando por ese campo de fecha ASC el resultado es:

NULL
2020-01-01
2021-01-01

y con DESC sería

2021-01-01
2020-01-01
NULL

Si queremos modificar este comportamiento y que al ordenar por un campo de fecha se considere NULL como mayor que cualquier fecha conocida tenemos que añadir un – al nombre del campo de fecha. ¡Ojo! Esto hará que si ordenamos por ASC el resultado sean fechas en orden descendiente y viceversa, así que quizá tengas que tenerlo en cuenta en tu código (en mi caso como es para ordenar una columna de una tabla de datos no importa mucho).

SELECT dateField FROM table ORDER BY -dateField ASC

NULL
2021-01-01
2020-01-01

SELECT dateField FROM table ORDER BY -dateField DESC

2020-01-01
2021-01-01
NULL

Redsys y Cloudfare

Si en el dominio en el que queremos integrar Redsys usamos Cloudfare las notificaciones (webhooks) que nos quiera enviar Redsys no nos llegarán porque Cloudfare las bloquea al considerar que no las está realizando un navegador al uso. Bien por Cloudfare, que para mucha morralla antes de que llegue a nuestro servidor, pero mal por el Koas que se tira un día y pico sin comprender por qué el webhook funciona si se llama a mano y no cuando lo hace Redsys.

La solución es incluir una regla en el cortafuegos de Cloudfare para que las peticiones que lleguen desde Redsys a la dirección del webhook no realicen esa comprobación. La forma de hacerlo está perfectamente explicada en esta entrada del blog de Marc Pàmpols.