Lo correcto es no guardar en las tablas los datos con cualquier formato, sino guardarlos solamente con el formato que previamente hemos establecido.

Sin embargo a veces podríamos encontrarnos con la situación de que el formato es desconocido.

Ejemplo:

Un usuario podría escribir: 123-456-789

Otro usuario podría escribir: 1-23-456-7-89

Otro usuario podría escribir: 12-345678-9

Otro usuario podría escribir: 123456789

Entonces, ¿qué condición de filtro debemos escribir en el SELECT para que sea cual sea el formato podamos obtener el dato que nos interesa?

Listado 1.

SELECT
   *
FROM
   MiTabla
WHERE
   REPLACE(MiColumna, '-', '') = 'MiValorBuscado'

Comentario 1:

Aunque como hemos visto podemos escribir un SELECT que nos muestre todas las filas que tienen el valor buscado, hay un error intrínseco de diseño porque estamos permitiendo que los usuarios ingresen los datos como se les antoja, eso no debería ser así.

Para estos casos una posibilidad es tener un trigger BEFORE INSERT OR UPDATE que se encargue de extraer los guiones antes de guardar la fila en la tabla, algo como:

Listado 2.


New.MiColumna = REPLACE(New.MiColumna, '-', '')

Comentario 2:

Aunque el Listado 1. funcionará bien y nos mostrará lo que deseamos ver, si la tabla es muy grande puede llegar a ser muy lento, demorarse una eternidad. ¿Por qué? Porque no se usará un índice y reemplazar un carácter por otro no es instantáneo. Por ese motivo es preferible guardar la columna sin los guiones, como se muestra en el Listado 2. Pero … ¿y si necesitamos a veces mostrarle al usuario la columna exactamente igual a cómo él la había escrito?

Una solución es agregarle una columna a la tabla, y entonces tendremos dos columnas:

Una columna, para guardar en ella lo que escribió el usuario

Otra columna, para guardar en ella lo que escribió el usuario pero sin los guiones

Esta segunda columna podríamos obtenerla mediante un trigger similar al del Listado 2. o mediante una columna computada, algo como:

Listado 3.


MiColumnaEditada COMPUTED BY (REPLACE(New.MiColumna, '-', ''))

Artículos relacionados:

El índice del blog Firebird21

El foro del blog Firebird21