Vérifiez si une chaîne contient une sous-chaîne dans SQL Server 2005, à l'aide d'une procédure stockée

245

J'ai une chaîne, @mainString = 'CATCH ME IF YOU CAN'. Je veux vérifier si le mot MEest à l'intérieur @mainString.

Comment vérifier si une chaîne a une sous-chaîne spécifique dans SQL?

NLV
la source

Réponses:

395

CHARINDEX () recherche une sous-chaîne dans une chaîne plus grande et renvoie la position de la correspondance, ou 0 si aucune correspondance n'est trouvée

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

Modifier ou à partir de la réponse Daniels, si vous voulez trouver un mot (et non des sous-composants de mots), votre appel CHARINDEX ressemblerait à:

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

(Ajouter des appels REPLACE () plus récursifs pour toute autre ponctuation pouvant survenir

Damien_The_Unbeliever
la source
2
Okie j'ai utilisé PATINDEX. Je vous remercie!
NLV
1
s / récursif / imbriqué / - "récursif" serait s'il était REPLACEappelé lui-même; "imbriqué", c'est quand le résultat d'un appel de fonction est immédiatement passé à une autre fonction.
Fund Monica's Lawsuit
2
Le «ME» serait-il sensible à la casse dans SQL ou auriez-vous également à faire une instruction if pour «moi» et «moi»?
a.powell
5
@ a.powell - dépend de la collation impliquée. Vous pouvez toujours le forcer dans ce test si vous en avez besoin dans un sens ou dans l'autre. Par exemple, comparer select CHARINDEX('ME' collate Latin1_General_CS_AS,'Home')et select CHARINDEX('ME' collate Latin1_General_CI_AS,'Home'). (Dans les collations, CSsignifie Sensible à la casse et je suis sûr que vous pouvez travailler CI).
Damien_The_Unbeliever
2
@VincePanuccio - Le traitement des chaînes de T-SQL est notoirement faible. La force de SQL réside dans les opérations basées sur des ensembles. Dans ce cas (vouloir faire un traitement de chaîne, et quelque chose où une expression régulière serait une solution évidente), il s'agit plutôt de choisir le mauvais outil pour le travail.
Damien_The_Unbeliever
120

Vous pouvez simplement utiliser des caractères génériques dans le prédicat (après IF, WHERE ou ON):

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

ou dans ce cas précis

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

(Mettez les espaces dans la chaîne entre guillemets si vous cherchez le mot entier, ou laissez-les si ME peut faire partie d'un mot plus gros).

Daniel Quinlan
la source
3
Si vous recherchez des correspondances de mots (votre deuxième exemple), vous devez a) ajouter un espace avant et après @mainString (afin que vous puissiez faire correspondre le premier ou le dernier mot), et b) supprimer la ponctuation
Damien_The_Unbeliever
2
C'est mieux que CHARINDEX () pour moi car dans mon cas particulier, je ne peux pas exécuter la fonction CHARINDEX () en raison des autorisations limitées.
James T Snell
1
(N'oubliez pas de préfixer toutes vos constantes de chaîne avec Nsi votre colonne est un nvarchar, sinon vous obtenez des conversions par ligne)
Richard Szalay