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

Cómo encontrar una cadena dentro de una cadena en SQL Server

En SQL Server, puede usar T-SQL CHARINDEX() o la función PATINDEX() función para encontrar una cadena dentro de otra cadena. Aquí hay una descripción general rápida de cada función.

Función CHARINDEX()

Esta función acepta 3 argumentos; la cadena a buscar, la cadena a buscar y una posición de inicio opcional.

El CHARINDEX() la sintaxis es así:

CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )

Donde expresiónParaBuscar es la expresión que desea buscar en la otra cadena y expressionToSearch es la otra cadena. La ubicación_inicial opcional se puede usar para especificar una posición dentro de expressionToSearch por el que empezar a buscar.

Tenga en cuenta que solo se devuelve la posición de la primera aparición.

Ejemplo

He aquí un ejemplo:

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

Resultado:

1

En este ejemplo, el primer argumento es Bob , lo que significa que estamos buscando el segundo argumento para Bob . El resultado es 1 porque esa es la posición donde Bob primero aparece en el segundo argumento.

También puedes notar que Bob en realidad aparece dos veces en la cadena, pero solo se devuelve la posición de la primera coincidencia.

Sin coincidencia

Si el segundo argumento no contenía Bob el resultado hubiera sido 0 .

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

Resultado:

0

Especificar una posición inicial

Puede especificar una posición inicial para comenzar a buscar. Esto significa que SQL Server omitirá cualquier aparición anterior a esa posición inicial. Sin embargo, los resultados aún se informan en función de su posición dentro de la cadena (no desde la posición de inicio).

Si esto suena confuso, el siguiente ejemplo debería ayudar:

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

Resultado:

17

Entonces, en este ejemplo, comenzamos a buscar en la posición 16 (que resulta ser el espacio antes del segundo Bob ). El resultado es que la primera aparición de Bob se salta y se devuelve la posición del segundo. Y podemos ver que su posición es de 17 caracteres desde el comienzo de la cadena (aunque es solo un carácter desde donde comenzamos a buscar).

Sensible a mayúsculas y minúsculas

Puede realizar explícitamente una búsqueda que distinga entre mayúsculas y minúsculas agregando la cláusula COLLATE a su instrucción SELECT:

Sensible a mayúsculas y minúsculas

Aquí hay una búsqueda que distingue entre mayúsculas y minúsculas:

SELECT CHARINDEX('Beer', 'Bob likes beer.' COLLATE Latin1_General_CS_AS);

Resultado:

0

Esto distingue entre mayúsculas y minúsculas porque _CS significa Sensible a mayúsculas y minúsculas.

Insensible a mayúsculas y minúsculas

Y aquí hay una búsqueda que no distingue entre mayúsculas y minúsculas:

SELECT CHARINDEX('Beer', 'Bob likes beer.' COLLATE Latin1_General_CI_AS);

Resultado:

11

Esto no distingue entre mayúsculas y minúsculas porque _CI significa mayúsculas y minúsculas.

Función PATINDEX()

El PATINDEX() función hace un trabajo similar a CHARINDEX() . Básicamente, tienes la opción de elegir cuál usar. La principal diferencia está en la sintaxis.

El PATINDEX() la sintaxis de la función 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 que se busca (normalmente una columna).

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.

Ejemplos

He aquí un ejemplo:

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

Resultado:

12

Sin embargo, esto es lo que sucede cuando no incluimos los caracteres comodín:

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

Resultado:

0

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

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

Resultado:

11

En este caso, el guión bajo (_ ) que es un comodín para cualquier carácter individual.