Compruebe si una cadena contiene una subcadena en SQL Server 2005, utilizando un procedimiento almacenado

Respuestas:

395

CHARINDEX () busca una subcadena dentro de una cadena más grande y devuelve la posición de la coincidencia, o 0 si no se encuentra ninguna coincidencia

if CHARINDEX('ME',@mainString) > 0
begin
    --do something
end

Edite o de daniels answer, si desea encontrar una palabra (y no subcomponentes de palabras), su llamada CHARINDEX se vería así:

CHARINDEX(' ME ',' ' + REPLACE(REPLACE(@mainString,',',' '),'.',' ') + ' ')

(Agregue más REEMPLAZO recursivo () para cualquier otra puntuación que pueda ocurrir

Damien_The_Unbeliever
fuente
2
Okie usé PATINDEX. ¡Gracias!
NLV
1
s / recursive / nested / - "recursive" sería si se REPLACEllama a sí mismo; "anidado" es cuando el resultado de una llamada de función se pasa inmediatamente a otra función.
Financia la demanda de Mónica el
2
¿El 'ME' distingue entre mayúsculas y minúsculas en SQL o también tendría que hacer una declaración if para 'Me' y 'me'?
a.powell
55
@ a.powell: depende de la recopilación involucrada. Siempre puede forzarlo dentro de esta prueba si lo necesita de una forma u otra. Por ejemplo, comparar select CHARINDEX('ME' collate Latin1_General_CS_AS,'Home')y select CHARINDEX('ME' collate Latin1_General_CI_AS,'Home'). (En intercalaciones, CSsignifica mayúsculas y minúsculas y estoy seguro de que puede hacer ejercicio CI).
Damien_The_Unbeliever 01 de
2
@VincePanuccio: el procesamiento de cadenas de T-SQL es notoriamente débil. La fortaleza de SQL está en las operaciones basadas en conjuntos. En este caso (querer hacer el procesamiento de cadenas, y algo donde una expresión regular sería una solución obvia), es más un caso de ellos elegir la herramienta incorrecta para el trabajo.
Damien_The_Unbeliever
120

Puede usar comodines en el predicado (después de IF, WHERE u ON):

@mainstring LIKE '%' + @substring + '%'

o en este caso específico

' ' + @mainstring + ' ' LIKE '% ME[., ]%'

(Coloque los espacios en la cadena entre comillas si está buscando la palabra completa, o déjelos fuera si ME puede ser parte de una palabra más grande).

Daniel Quinlan
fuente
3
Si está buscando coincidencias de palabras (su segundo ejemplo), necesitaría a) agregar un espacio antes y después de @mainString (para que pueda coincidir con la primera o la última palabra) yb) eliminar la puntuación
Damien_The_Unbeliever
2
Esto es mejor que CHARINDEX () para mí porque en mi caso particular, no puedo ejecutar la función CHARINDEX () debido a permisos limitados.
James T Snell
1
(Simplemente no olvide ponerle un prefijo a todas sus constantes de cadena Nsi su columna es una nvarchar, de lo contrario obtendrá conversiones por fila)
Richard Szalay