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

CHARINDEX() vs PATINDEX() en SQL Server:¿cuál es la diferencia?

En SQL Server, puede usar el CHARINDEX() o la función PATINDEX() función para encontrar una cadena dentro de una cadena. Estas son funciones de cadena de Transact-SQL y también están disponibles en las bases de datos de Azure.

En la superficie, estas funciones parecen hacer exactamente lo mismo y, en muchos casos, puede usar cualquiera que prefiera usar.

Sin embargo, hay un par de distinciones que podrían dictar qué función decide usar en ciertos escenarios. Estos se pueden resumir en los siguientes:

  • PATINDEX() le permite utilizar caracteres comodín para buscar patrones. CHARINDEX() no.
  • CHARINDEX() acepta un tercer argumento que le permite especificar la posición de inicio de la búsqueda. PATINDEX() no.

Más detalles sobre estos puntos a continuación.

Definición

Primero, veamos la definición oficial de cada función.

CHARINDEX()
Busca una expresión de carácter dentro de una segunda expresión de carácter y, si la encuentra, devuelve la posición inicial de la primera expresión.
PATINDEX()
Devuelve la posición inicial de la primera aparición de un patrón en una expresión específica, o ceros si no se encuentra el patrón, en todos los tipos de datos de texto y caracteres válidos.

Sintaxis

Y aquí está la sintaxis oficial de cada función.

ÍNDICE DE CARÁCTER()

CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )

PATINEX()

PATINDEX ( '%pattern%' , expression )

Entonces, ambas funciones le permiten buscar una expresión de carácter, sin embargo, PATINDEX() La función le permite buscar un patrón . Entonces, esta es una funcionalidad adicional que no obtiene con CHARINDEX() función. Con PATINDEX() puede usar caracteres comodín para especificar un patrón de búsqueda, lo que podría ser muy útil en algunas situaciones.

Sin embargo, CHARINDEX() acepta tres argumentos mientras que PATINDEX() solo acepta dos. El CHARINDEX() La función acepta un tercer argumento opcional que le permite especificar la posición inicial de la búsqueda. En otras palabras, el CHARINDEX() La función le permite devolver solo aquellas coincidencias que ocurren después de cierto punto en la cadena.

Ejemplos

Estos son ejemplos que demuestran la funcionalidad adicional proporcionada por cada función.

ÍNDICE DE CARÁCTER()

Aquí, proporciono un tercer argumento para especificar una posición para comenzar a buscar. En este caso, omitirá la primera aparición de Bob y devolverá la posición de la segunda ocurrencia.

SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.', 16);

Resultado:

17

Entonces, como se mencionó, no puede hacer esto con PATINDEX() porque no acepta ese tercer parámetro.

PATINEX()

Ahora aquí tienes un ejemplo de algo que puedes hacer con PATINDEX() que no puedes hacer con CHARINDEX() . En este ejemplo, usamos caracteres comodín para buscar un patrón:

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

Resultado:

11

En este caso, usamos los signos de porcentaje (% ) que son comodines para indicar que cualquier número de caracteres podría continuar y tener éxito en nuestra cadena de búsqueda. También usamos el guión bajo (_ ) que es un comodín para cualquier single personaje.

Conclusión

Entonces, mientras tanto CHARINDEX() y PATINDEX() proporcionan una funcionalidad similar y, en muchos casos, cualquiera de los dos podría usarse en lugar del otro, hay ocasiones en las que necesitaría usar uno sobre el otro.

Específicamente, usaría CHARINDEX() cuando desee especificar una posición inicial dentro de la cadena para buscar. Y usarías PATINDEX() cada vez que necesite especificar un patrón para buscar.