jueves, 26 de enero de 2023

Claves únicas y valores null

Siguiendo con la historia del post anterior, me encontré con esta situación:

Tenemos una tabla que contiene plantillas para mensajes a ser enviados a los clientes, llamémosle PLANTILLAS, con una clave primaria subrogada en el campo PLANTILLA_ID.

A modo de facilitar la identificación desde una aplicación externa necesitamos ponerles nombres únicos a estas plantillas, pero no necesariamente a todas. A raíz de esto agregamos a la tabla PLANTILLAS el campo NOMBRE_PLANTILLA.

Para asegurar la unicidad de los nombres pensé en agregar una clave única con el nuevo campo NOMBRE_PLANTILLA, pero el problema era: ¿Qué pasaría con los registros de las plantillas que todavía no iban a tener nombre? ¿Al crear la clave única iba a obligar a que todos los registros tengan nombre (lo cual no queríamos)?

Encontré la respuesta en AskTOM (Chris Saxon te quiero 😃) que me aclaró las dudas:

Un valor null nunca es igual a otro null, por lo tanto los registros con valor null en el campo de la clave única siempre satisfacen la unicidad.

En resumen, nos va a obligar a tener valores únicos en los registros con valores distintos a null, pero vamos a poder tener tantos registros con valores null como queramos, wohooo!!

martes, 24 de enero de 2023

Expresiones Regulares al rescate

En la empresa en la que trabajo tenemos definidas unas cuantas plantillas para enviar mensajes a los clientes, con un formato similar a este:
Lorem ipsum dolor sit amet {variable-1}, consectetur adipiscing {variable-2} elit. Proin {variable-3} vitae dolor quis nisi euismod volutpat. Mauris dignissim mollis nulla {variable-4}. Nulla vel magna {variable-1} suscipit mi aliquet molestie.
Lo interesante es que cuando se hace el envío del mensaje las variables se reemplazan por los valores "personalizados" de acuerdo a cada cliente u operación.

Estas plantillas se guardan tal cual en el campo de una tabla dentro de una Base de Datos Oracle.

En esta ocasión, necesitábamos de alguna forma listar el nombre de todas las variables que se pueden reemplazar dentro de una plantilla dada, por ejemplo, para la plantilla de arriba el resultado esperado es:
{variable-1}
{variable-2}
{variable-3}
{variable-4}
Lo primero que pensé fue: "Esto se puede resolver con Expresiones Regulares 🤔" y creí que sería buena idea buscar si alguien ya tuvo esta misma necesidad alguna vez.

Googleé y encontré algunos casos similares en Stack Overflow. En particular esta pregunta hacía prácticamente lo que necesitaba y lo mejor de todo: ¡con sólo SQL!

Pero no todo era tan fácil, había que ajustar la expresión regular para que se acomode a nuestras necesidades:
\{[A-Za-z0-9\-]+\}
También recurrí a la documentación de Oracle y leí sobre estas funciones:
Después de hacer unas pruebas básicas para entender estas funciones, llegué finalmente a este query:
select distinct regexp_substr(template, '\{[A-Za-z0-9\-]+\}', 1, level) as var
  from (select 'Lorem ipsum dolor sit amet {variable-1}, consectetur adipiscing {variable-2} elit. Proin {variable-3} vitae dolor quis nisi euismod volutpat. Mauris dignissim mollis nulla {variable-4}. Nulla vel magna {variable-1} suscipit mi aliquet molestie.' as template
          from dual)
connect by level <= regexp_count(template, '\{[A-Za-z0-9\-]+\}')

Por ahora esto nos sirve, pero igual hay algunas cosas que mejorar o considerar, por ejemplo:
  • Eliminar las llaves para tener sólo el nombre de las variables
  • Si la plantilla no contiene variables, igual el query trae un registro con valor null
También dejo esta info que me pareció útil sobre clases POSIX para expresiones regulares.

viernes, 15 de enero de 2021

Hola Mundo

Hola!

Mi nombre es Javier y me gusta programar. Soy un programador cualquiera.
Me gusta explorar nuevas tecnologías y entender cómo funcionan, y sobre todo, nunca dejar de aprender.

Acá voy a escribir sobre cosas que me gustan.

Si alguien alguna vez lee esto...
Gracias y Bienvenido/a!

Javier

Claves únicas y valores null

Siguiendo con la historia del post anterior, me encontré con esta situación: Tenemos una tabla que contiene plantillas para mensajes a ser e...