En SQL Server, puede usar la función T-SQL PATINDEX()
para encontrar un patrón dentro de una cadena. Específicamente, la función solo devuelve la primera aparición del patrón dentro de la cadena.
La función acepta dos argumentos; el patrón, y la cadena.
Puede usar caracteres comodín dentro del patrón.
Sintaxis
La sintaxis es así:
PATINDEX ( '%pattern%' , expression )
Donde pattern es una expresión de caracteres que contiene la secuencia que se busca, y expression es la expresión que se busca.
Ejemplo 1 – Uso Básico
he Aquí un ejemplo de cómo funciona:
SELECT PATINDEX('%eer%', 'Bob likes beer.') AS Result;
Resultado:
+----------+| Result ||----------|| 12 |+----------+
El signo de porcentaje (%
) es un carácter comodín que representa cualquier cadena de cero o más caracteres.
Ejemplo 2-No hay coincidencia
Esto es lo que sucede cuando no incluimos los caracteres comodín:
SELECT PATINDEX('eer', 'Bob likes beer.') AS Result;
Resultado:
+----------+| Result ||----------|| 0 |+----------+
a Pesar de que, si la totalidad de la cadena coincide con el patrón sin ningún comodín, usted conseguirá un partido:
SELECT PATINDEX('Bob', 'Bob') AS Result;
Resultado:
+----------+| Result ||----------|| 1 |+----------+
sin Embargo, usted no conseguirá un partido si la cadena contiene más caracteres:
SELECT PATINDEX('Bob', 'Bob likes beer.') AS Result;
Resultado:
+----------+| Result ||----------|| 0 |+----------+
En cuyo caso podría utilizar un solo comodín:
SELECT PATINDEX('Bob%', 'Bob likes beer.') AS Result;
Resultado:
+----------+| Result ||----------|| 1 |+----------+
También puede usar un comodín en algún lugar en el medio del patrón:
SELECT PATINDEX('B%r.', 'Bob likes beer.') AS Result;
Resultado:
+----------+| Result ||----------|| 1 |+----------+
En este caso tenemos una coincidencia porque el inicio y el final de la cadena coinciden con el inicio y fin del patrón. Por supuesto, la mitad de la cadena también coincidía con la mitad del patrón, porque todos los demás caracteres están cubiertos por el signo de porcentaje.
Ejemplo 3-El comodín de subrayado
Aquí hay otro ejemplo en el que introducimos otro carácter comodín:
SELECT PATINDEX('B_er', 'Beer') AS Result;
Resultado:
+----------+| Result ||----------|| 1 |+----------+
El carácter de subrayado (_
), que es un comodín para cualquier carácter individual. Por lo tanto, solo coincidirá si hay exactamente un personaje en esa posición.
Por supuesto, el patrón anterior podría coincidir con muchas cadenas diferentes. Por ejemplo:
SELECT PATINDEX('B_er', 'Beer') AS 'Beer', PATINDEX('B_er', 'Bier') AS 'Bier', PATINDEX('B_er', 'Baer') AS 'Baer', PATINDEX('B_er', 'B er') AS 'B er';
Resultado:
+--------+--------+--------+--------+| Beer | Bier | Baer | B er ||--------+--------+--------+--------|| 1 | 1 | 1 | 1 |+--------+--------+--------+--------+
Ejemplo 4 – Comparación de los comodines _ y %
Este ejemplo muestra la diferencia entre los caracteres comodín _
y %
.
SELECT PATINDEX('B%r', 'Beer') AS '%', PATINDEX('B_r', 'Beer') AS '_', PATINDEX('B__r', 'Beer') AS '__';
Resultado:
+-----+-----+------+| % | _ | __ ||-----+-----+------|| 1 | 0 | 1 |+-----+-----+------+
El subrayado sólo los partidos cuando hay exactamente un carácter en esa posición. Para que coincidan dos caracteres, necesitamos usar dos guiones bajos.
El signo de porcentaje, por otro lado, coincide con cualquier número de caracteres, incluido cero, como se ve en el siguiente ejemplo:
SELECT PATINDEX('Bee%r', 'Beer') AS '%', PATINDEX('Bee_r', 'Beer') AS '_', PATINDEX('Bee__r', 'Beer') AS '__';
Resultado:
+-----+-----+------+| % | _ | __ ||-----+-----+------|| 1 | 0 | 0 |+-----+-----+------+
Ejemplo 5 – Un ejemplo de base de datos
Aquí hay un ejemplo de uso de esta función en una consulta de base de datos:
USE Music;SELECT AlbumName, PATINDEX('%the%', AlbumName) AS 'Pattern Index'FROM AlbumsWHERE PATINDEX('%the%', AlbumName) > 0;
Resultado:
+-------------------------+-----------------+| AlbumName | Pattern Index ||-------------------------+-----------------|| Singing Down the Lane | 14 || Ziltoid the Omniscient | 9 || No Prayer for the Dying | 15 || The Sixteen Men of Tain | 1 |+-------------------------+-----------------+
En este caso utilizo la cláusula WHERE
para devolver solo los álbumes que coinciden, junto con su resultado PATINDEX()
. Si eliminara la cláusula WHERE
, todos los álbumes habrían sido devueltos, independientemente de si coincidían o no.
Para aquellos que no coincidían, el resultado PATINDEX()
sería cero.
USE Music;SELECT TOP(10) AlbumName, PATINDEX('%the%', AlbumName) AS 'Pattern Index'FROM Albums;
Resultado:
+-------------------------+-----------------+| AlbumName | Pattern Index ||-------------------------+-----------------|| Powerslave | 0 || Powerage | 0 || Singing Down the Lane | 14 || Ziltoid the Omniscient | 9 || Casualties of Cool | 0 || Epicloud | 0 || Somewhere in Time | 0 || Piece of Mind | 0 || Killers | 0 || No Prayer for the Dying | 15 |+-------------------------+-----------------+
Ejemplo 6 – Primera Aparición Sólo
Como se mencionó, PATINDEX()
devuelve sólo la primera ocurrencia del patrón dentro de la cadena.
SELECT PATINDEX('%and%', 'Bob and beer and popcorn.') AS Result;
Resultado:
+----------+| Result ||----------|| 5 |+----------+
El CHARINDEX() la Función
El T-SQL CHARINDEX()
función es similar a la de PATINDEX()
. Sin embargo, hay algunas diferencias entre los dos. En particular, el PATINDEX()
acepta caracteres comodín, pero no una posición inicial. CHARINDEX()
por otro lado acepta una posición inicial, pero no caracteres comodín.