sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo funciona la función PATINDEX() en SQL Server (T-SQL)

En SQL Server, puede usar T-SQL PATINDEX() función para encontrar un patrón dentro de una cadena. Específicamente, la función solo devuelve el primero ocurrencia del patrón dentro de la cadena.

La función acepta dos argumentos; el patrón y la cuerda.

Puede utilizar caracteres comodín dentro del patrón.

Sintaxis

La sintaxis es así:

PATINDEX ( '%pattern%' , expression )

Donde patrón es una expresión de carácter que contiene la secuencia a buscar y expresión es la expresión a buscar.

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:Sin coincidencia

Esto es lo que sucede cuando no incluimos los caracteres comodín:

SELECT PATINDEX('eer', 'Bob likes beer.') AS Result;

Resultado:

+----------+
| Result   |
|----------|
| 0        |
+----------+

Aunque, si la cadena completa coincide con el patrón sin comodines, obtendrá una coincidencia:

SELECT PATINDEX('Bob', 'Bob') AS Result;

Resultado:

+----------+
| Result   |
|----------|
| 1        |
+----------+

Sin embargo, no obtendrá una coincidencia si la cadena contiene más caracteres:

SELECT PATINDEX('Bob', 'Bob likes beer.') AS Result;

Resultado:

+----------+
| Result   |
|----------|
| 0        |
+----------+

En cuyo caso, podría usar un solo comodín:

SELECT PATINDEX('Bob%', 'Bob likes beer.') AS Result;

Resultado:

+----------+
| Result   |
|----------|
| 1        |
+----------+

También podría usar un solo 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, obtuvimos una coincidencia porque el inicio y el final de la cadena coincidieron con el inicio y el final 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 guión bajo comodín

Aquí hay otro ejemplo donde introducimos otro carácter comodín:

SELECT PATINDEX('B_er', 'Beer') AS Result;

Resultado:

+----------+
| Result   |
|----------|
| 1        |
+----------+

El guión bajo (_ ) que es un comodín para cualquier carácter individual. Por lo tanto, solo coincidirá si hay exactamente un carácter 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 del _ y % Comodines

Este ejemplo demuestra la diferencia entre _ y % caracteres comodín.

SELECT 
  PATINDEX('B%r', 'Beer') AS '%',
  PATINDEX('B_r', 'Beer') AS '_',
  PATINDEX('B__r', 'Beer') AS '__';

Resultado:

+-----+-----+------+
| %   | _   | __   |
|-----+-----+------|
| 1   | 0   | 1    |
+-----+-----+------+

El guión bajo solo coincide cuando hay exactamente un carácter en esa posición. Para hacer coincidir dos caracteres, necesitamos usar dos guiones bajos.

El signo de porcentaje, por otro lado, coincide con cualquier número de caracteres, incluido el 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 del uso de esta función en una consulta de base de datos:

USE Music;
SELECT 
  AlbumName,
  PATINDEX('%the%', AlbumName) AS 'Pattern Index'
FROM Albums
WHERE 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 uso el WHERE cláusula para devolver solo aquellos álbumes que realmente coincidan, junto con su PATINDEX() resultado. Si dejo caer el WHERE cláusula, todos los álbumes habrían sido devueltos, independientemente de si coincidían o no.

Para aquellos que no coincidieron, el PATINDEX() el resultado 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 ocurrencia solamente

Como se mencionó, PATINDEX() devuelve solo el primero ocurrencia del patrón dentro de la cadena.

SELECT PATINDEX('%and%', 'Bob and beer and popcorn.') AS Result;

Resultado:

+----------+
| Result   |
|----------|
| 5        |
+----------+

El CHARINDEX() Función

El CHARINDEX() de T-SQL la función es similar a 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.