martes, 6 de diciembre de 2011

Uso de LIKE con campos de tipo numérico en PostgreSQL

El operador LIKE de SQL sirve para comparar expresiones según un patrón (más info acá). Pero funciona sólo con campos tipo texto (CHAR, VARCHAR, TEXT). Si se quiere hacer una comparación sobre un campo tipo INTEGER no va a funcionar (tuve que hacer dicha comparación al configurar un campo de formulario con autocompletado con Symfony).

Sin embargo se puede hacer y el truco es muy sencillo, ya que simplemente debemos 'convertir' el campo de tipo entero a una cadena de texto. Esto se hace con la función TO_CHAR. Veamos un ejemplo de consulta sencilla con esta función:

SELECT codigo FROM tabla WHERE TO_CHAR(codigo, '9999') LIKE '%texto%';

Acá le estoy dando formato de 4 dígitos al código pero si hay códigos más largos habrá que usar más dígitos en el formato de TO_CHAR:

SELECT codigo FROM tabla WHERE TO_CHAR(codigo, '9999999999') LIKE '%texto%';

La función entregará espacios vacíos para los números que tengan menos dígitos. Si queremos eliminarlos podemos hacerlo con la función TRIM:

SELECT codigo FROM tabla WHERE TRIM(TO_CHAR(codigo, '9999999999')) LIKE '%texto%';

Como dato curioso de esta última consulta debo decir que al usar esta consulta con el widget de autocompletado de sfFormExtraPlugin no funciona correctamente, ya que no entrega todos los resultados, así que he tenido que dejar la forma más sencilla de la consulta.