Si has escrito muchas aplicaciones, probablemente te hayas encontrado con situaciones en las que necesitas identificar si un carácter específico o conjunto de caracteres aparece en una cadena. En este artículo, discutiremos cómo usar las funciones CHARINDEX y PATINDEX para buscar columnas de texto y cadenas de caracteres. Te mostraremos cómo funcionan cada una de estas funciones y explicaremos las diferencias entre ellas. También proporcionaremos algunos ejemplos de cómo podrías usar estas funciones para resolver diferentes situaciones de búsqueda de caracteres.
Cómo usar la función CHARINDEX
La función CHARINDEX devuelve la posición de inicio de un carácter o una cadena de caracteres dentro de otra cadena de caracteres. La función CHARINDEX se llama utilizando el siguiente formato:
CHARINDEX(expresión1, expresión2 [, posición_inicial])
Donde expresión1 es la cadena de caracteres que se desea encontrar en expresión2, y posición_inicial es la posición donde la función CHARINDEX comenzará a buscar expresión1 en expresión2. La función CHARINDEX devuelve un número entero. El valor entero devuelto es la posición donde se encuentran los caracteres que se están buscando dentro de la cadena que se está buscando. Si CHARINDEX no encuentra los caracteres que estás buscando, entonces la función devuelve el valor entero cero.
Supongamos que ejecutamos la siguiente llamada a la función CHARINDEX:
CHARINDEX('SQL', 'Microsoft SQL Server')
Esta llamada a la función devolverá la ubicación de inicio de la cadena de caracteres “SQL” en la cadena “Microsoft SQL Server”. En este caso, la función CHARINDEX devolverá el número 11, que es la posición de inicio de “S” en la cadena “Microsoft SQL Server”.
Ahora supongamos que tenemos el siguiente comando CHARINDEX:
CHARINDEX('7.0', 'Microsoft SQL Server 2000')
En este ejemplo, la función CHARINDEX devolverá cero ya que la cadena de caracteres “7.0” no se puede encontrar en la cadena “Microsoft SQL Server 2000”.
Veamos un par de ejemplos de cómo podrías usar la función CHARINDEX para resolver algunos problemas reales de T-SQL. Para el primer ejemplo, supongamos que quieres mostrar solo el apellido de la columna ContactName para los primeros 5 registros en la tabla Customer de la base de datos Northwind. Aquí están los primeros 5 registros:
ContactName -------------------- Maria Anders Ana Trujillo Antonio Moreno Thomas Hardy Christina Berglund
Como puedes ver, el ContactName contiene tanto el nombre como el apellido del cliente, donde el nombre y el apellido están separados por un espacio. Usaremos la función CHARINDEX para identificar la posición del espacio entre los dos nombres. De esta manera, podemos usar la posición del espacio para analizar el ContactName y mostrar solo la parte del apellido de la columna. Aquí tienes un código T-SQL para mostrar solo el apellido de los primeros 5 registros en la tabla Customer de Northwind:
SELECT TOP 5 SUBSTRING(ContactName, CHARINDEX(' ', ContactName) + 1, LEN(ContactName)) AS [Apellido] FROM Northwind.dbo.customers
Aquí está el resultado de este comando:
Apellido -------------------- Anders Trujillo Moreno Hardy Berglund
La función CHARINDEX encontró el espacio entre el nombre y el apellido, por lo que la función substring pudo dividir el ContactName y mostrar solo el apellido. Sumamos 1 al valor entero que devolvió CHARINDEX, para que el apellido mostrado no comenzara con un espacio.
Para el segundo ejemplo, supongamos que quieres contar todos los registros de una tabla donde una columna dada contiene una cadena de caracteres específica. La función CHARINDEX se puede usar para satisfacer tu solicitud. Para contar todas las direcciones en la tabla Northwind.dbo.Customer donde la columna Address contiene la palabra ‘Road’ o una abreviatura para carretera (‘Rd’), tu declaración SELECT se vería así:
SELECT COUNT(*) FROM Northwind.dbo.Customers WHERE CHARINDEX('Rd', Address) > 0 OR CHARINDEX('Road', Address) > 1
¿Cómo funciona la función PATINDEX?
La función PATINDEX devuelve la posición de inicio de un carácter o cadena de caracteres dentro de otra cadena o expresión. Como se mencionó anteriormente, PATINDEX tiene funcionalidad adicional sobre CHARINDEX. PATINDEX admite caracteres comodín en la cadena de patrón de búsqueda. Esto hace que PATINDEX sea valioso para buscar patrones de cadenas variables. El comando PATINDEX tiene la siguiente forma:
PATINDEX('%patrón%', expresión)
Donde “patrón” es la cadena de caracteres que estás buscando y expresión es la cadena en la que estás buscando. Comúnmente, la expresión es una columna en una tabla. El signo “%” es necesario al principio y al final del patrón, a menos que estés buscando el patrón al principio y/o al final de la expresión.
Al igual que la función CHARINDEX, la función PATINDEX devuelve la posición de inicio del patrón dentro de la cadena que se está buscando. Si tienes una llamada a la función PATINDEX de la siguiente manera:
PATINDEX('%BC%', 'ABCD')
Entonces el resultado de la llamada a la función PATINDEX es 2, que es lo mismo que la función CHARINDEX. Los “%” en el comando anterior le indican al comando PATINDEX que encuentre la posición de la cadena “BC” donde la cadena podría tener cero o más caracteres antes o después de “BC”. El signo “%” es un carácter comodín.
Si quieres determinar si una cadena comienza con un conjunto específico de caracteres, debes omitir el primer signo “%”, y tu llamada a PATINDEX se vería así:
PATINDEX('AB%', 'ABCD')
En este caso, la función PATINDEX devuelve un 1, lo que indica que se encontró el patrón ‘AB’ en la expresión ‘ABCD’.
Ahora, con los caracteres comodín, puedes crear una situación de coincidencia de patrones mucho más complicada que las simples que te he mostrado hasta ahora. Supongamos que quieres determinar si una cadena de caracteres contiene las letras A y Z, así como cualquier número numérico. Entonces tu llamada a la función PATINDEX podría verse así:
PATINDEX('%[A,Z,0-9]%[A,Z,0-9]%[A,Z,0-9]%', 'XYZABC123')
Observa que el patrón que estoy buscando en el ejemplo anterior utiliza varias referencias comodín. Revisa la documentación de SQL Server Books Online para obtener más información sobre la sintaxis de los comodines.
Veamos un par de ejemplos de cómo podríamos usar el comando PATINDEX junto con una declaración SELECT. Supongamos que quieres encontrar todos los registros que contienen las palabras “Pan” o “pan” en la columna de texto Descripción de la tabla Northwind.dbo.Categories, entonces tu declaración SELECT se vería así:
SELECT Descripción FROM Northwind.dbo.Categories WHERE PATINDEX('%[p,P]an%', descripción) > 0
Aquí utilicé los comodines para buscar una “p” en minúscula o mayúscula. Cuando ejecuto esta declaración SELECT en mi base de datos Northwind, obtengo las siguientes columnas de Descripción mostradas:
Descripción -------------------------------------------------- Postres, dulces y panes dulces Pan, galletas, pasta y cereal
Aquí tienes otro ejemplo donde utilicé algunas referencias comodín adicionales para encontrar algunos registros. Este ejemplo excluye la Descripción que tiene una ‘e’ como segunda letra del conjunto de resultados en el ejemplo anterior:
SELECT Descripción FROM Northwind.dbo.Categories WHERE PATINDEX('%[p,P]an%', descripción) > 0 AND PATINDEX('_[^e]%', descripción) = 1
Agregando una llamada adicional a la función PATINDEX a la cláusula WHERE que utiliza el símbolo comodín ^, pude excluir la descripción “Postres, dulces y panes dulces”. El ejemplo anterior devuelve la siguiente descripción única:
Descripción -------------------------------------------------- Pan, galletas, pasta y cereal
Conclusión
Como puedes ver, las funciones CHARINDEX y PATINDEX realizan búsquedas de patrones similares dentro de una cadena de caracteres. La función PATINDEX proporciona especificaciones de comodines, lo que le permite ser utilizada para diferentes tipos de coincidencias de patrones, mientras que la función CHARINDEX no lo hace. Dependiendo de lo que necesites hacer, estas dos funciones son excelentes para ayudarte a buscar, manipular y analizar cadenas de caracteres en SQL Server.
» Ver todos los artículos del columnista Gregory A. Larsen