Buscar este blog

jueves, 9 de diciembre de 2010

CARÁCTER UNDERSCORE (_) EN SENTENCIA LIKE EN PL/SQL

Muchas veces hemos utilizado la sentencia LIKE en SQL para realizar filtros en consultas y encontrar los registros que tienen el campo de filtro similar (LIKE) a lo que necesitamos encontrar. Por ejemplo, suponiendo que tenemos una tabla donde almacenamos la información de personas y deseamos encontrar a todas las personas que dentro de su nombre se encuentran la palabra LUIS, nuestra sentencia SQL quedaría de la siguiente forma:

SELECT *
FROM PERSONA
WHERE NOMBRE LIKE ‘%LUIS%’;

En este caso el carácter porcentaje (%) es un carácter especial de SQL que junto con la sentencia LIKE nos ayuda a indicar que los caracteres que precedan o que sigan a una secuencia de caracteres no se tomaran en cuenta. En el caso de la consulta anterior no importa que caracteres existan antes y después de la palabra LUIS en el valor del campo, siempre que exista esta secuencia de caracteres se dará como verdadera la condición.

Pero que ocurre cuando tenemos nombres que utilizan el carácter underscore? Por ejemplo, si tenemos una lista de productos, en los que los códigos son nombres compuestos por underscore, como por ejemplo P_A_123, P_AB_234, P_AC_345, etc., encontraremos que al momento de ejecutar una sentencia como la siguiente:


SELECT *
FROM PRODUCTOS
WHERE CODIGO LIKE ‘P_A_%’;


No nos retornara los registros que deseamos, si no que nos devolverá como resultado el listado de todos los registros ignorando por completo el ultimo underscore (_), pero ¿porque ocurre esto? Esto es debido a que el carácter underscore (_) dentro de SQL en algunas sentencias es utilizado como un carácter especial, es por esta razón que se debe de especificar dentro de la sentencia LIKE que el carácter underscore  (_) debe de ser tomado con su valor literal, esto se logra modificando la sentencia anterior de la siguiente forma:


SELECT *
FROM PRODUCTOS
WHERE CODIGO LIKE ‘P\_A\_%’ ESCAPE ‘\’;


De este modo lograremos obtener el resultado deseado que en este caso será únicamente el registro con el código igual P_A_123.