Comment pouvez-vous supprimer tous les caractères qui ne sont pas alphabétiques d'une chaîne?
Et les non alphanumériques?
Cela doit-il être une fonction personnalisée ou existe-t-il également des solutions plus généralisables?
Comment pouvez-vous supprimer tous les caractères qui ne sont pas alphabétiques d'une chaîne?
Et les non alphanumériques?
Cela doit-il être une fonction personnalisée ou existe-t-il également des solutions plus généralisables?
Essayez cette fonction:
Create Function [dbo].[RemoveNonAlphaCharacters](@Temp VarChar(1000))
Returns VarChar(1000)
AS
Begin
Declare @KeepValues as varchar(50)
Set @KeepValues = '%[^a-z]%'
While PatIndex(@KeepValues, @Temp) > 0
Set @Temp = Stuff(@Temp, PatIndex(@KeepValues, @Temp), 1, '')
Return @Temp
End
Appelez ça comme ça:
Select dbo.RemoveNonAlphaCharacters('abc1234def5678ghi90jkl')
Une fois que vous avez compris le code, vous devriez voir qu'il est relativement simple de le modifier pour supprimer également d'autres caractères. Vous pouvez même rendre cela suffisamment dynamique pour passer votre modèle de recherche.
J'espère que ça aide.
Version paramétrée de la réponse géniale de G Mastros :
Alphabétique uniquement:
Numérique uniquement:
Alphanumérique uniquement:
Non alphanumérique:
la source
SELECT dbo.fn_StripCharacters('a1!s2 spaces @d3# f4$', '^a-z0-9\s')
ce qui supprime encore les espaces. J'ai également essayé d'utiliser[[:blank:]]
mais cela casse la fonction et rien n'est supprimé de la chaîne. Le plus proche que j'ai obtenu est d'utiliser:SELECT dbo.fn_StripCharacters('a1!s2 spaces @d3# f4$', '^a-z0-9 ')
(coder en dur un espace dans le modèle regex). Cependant, cela ne supprime pas les sauts de ligne.SELECT dbo.fn_StripCharacters('a1!s2 spaces @d3# f4$', '^ a-z0-9')
Croyez-le ou non, dans mon système, cette fonction moche fonctionne mieux que l'élégante G Mastros.
la source
ASCII
entier ici et comparez directement la sortie deSUBSTRING
avec certains caractères, par exemple:SET @ch=SUBSTRING(@s, @p, 1)
etIF @ch BETWEEN '0' AND '9' OR @ch BETWEEN 'a' AND 'z' OR @ch BETWEEN 'A' AND 'Z' ...
Je savais que SQL était mauvais pour la manipulation de chaînes, mais je ne pensais pas que ce serait aussi difficile. Voici une fonction simple pour supprimer tous les nombres d'une chaîne. Il y aurait de meilleures façons de le faire, mais c'est un début.
Production
Round 2 - Liste noire basée sur les données
Production
Mon défi aux lecteurs: pouvez-vous rendre cela plus efficace? Qu'en est-il de l'utilisation de la récursivité?
la source
Si vous êtes comme moi et que vous n'avez pas accès à simplement ajouter des fonctions à vos données de production mais que vous souhaitez tout de même effectuer ce type de filtrage, voici une solution purement SQL utilisant une table PIVOT pour rassembler à nouveau les éléments filtrés.
NB J'ai codé en dur le tableau jusqu'à 40 caractères, vous devrez en rajouter si vous avez des chaînes plus longues à filtrer.
la source
Après avoir examiné toutes les solutions données, j'ai pensé qu'il devait y avoir une méthode SQL pure qui ne nécessite pas de fonction ou de requête CTE / XML, et n'implique pas de difficultés à maintenir des instructions REPLACE imbriquées. Voici ma solution:
L'avantage de le faire de cette façon est que les caractères valides sont contenus dans la seule chaîne de la sous-requête, ce qui facilite la reconfiguration pour un jeu de caractères différent.
L'inconvénient est que vous devez ajouter une ligne de SQL pour chaque caractère jusqu'à la taille de votre colonne. Pour rendre cette tâche plus facile, je viens d'utiliser le script Powershell ci-dessous, cet exemple si pour un VARCHAR (64):
la source
Voici une autre façon de supprimer les caractères non alphabétiques à l'aide d'un fichier
iTVF
. Tout d'abord, vous avez besoin d'un séparateur de chaînes basé sur un modèle. En voici un extrait de l' article de Dwain Camp :Maintenant que vous disposez d'un séparateur basé sur un modèle, vous devez diviser les chaînes qui correspondent au modèle:
puis les concaténer pour obtenir le résultat souhaité:
ÉCHANTILLON
Résultat:
la source
Cette solution, inspirée de la solution de M. Allen, nécessite une
Numbers
table d'entiers (que vous devriez avoir sous la main si vous voulez faire des opérations de requêtes sérieuses avec de bonnes performances). Il ne nécessite pas de CTE. Vous pouvez modifier l'NOT IN (...)
expression pour exclure des caractères spécifiques ou la remplacer par une expressionIN (...)
ORLIKE
pour ne conserver que certains caractères.la source
Voici une solution qui ne nécessite pas de créer une fonction ou de répertorier toutes les instances de caractères à remplacer. Il utilise une instruction WITH récursive en combinaison avec un PATINDEX pour rechercher les caractères indésirables. Il remplacera tous les caractères indésirables dans une colonne - jusqu'à 100 caractères incorrects uniques contenus dans une chaîne donnée. (EG "ABC123DEF234" contiendrait 4 mauvais caractères 1, 2, 3 et 4) La limite de 100 est le nombre maximum de récursions autorisées dans une instruction WITH, mais cela n'impose pas de limite au nombre de lignes à traiter, ce qui n'est limité que par la mémoire disponible.
Si vous ne voulez pas de résultats DISTINCT, vous pouvez supprimer les deux options du code.
la source
Je mets cela aux deux endroits où PatIndex est appelé.
pour la fonction personnalisée ci-dessus RemoveNonAlphaCharacters et l'a renommée RemoveNonAlphaNumericCharacters
la source
- Créez d'abord une fonction
Appelez maintenant cette fonction comme
Son résultat comme
la source
Du point de vue des performances, j'utiliserais la fonction en ligne:
la source
Voici une autre solution CTE récursive, basée sur la réponse de @Gerhard Weiss ici . Vous devriez pouvoir copier et coller tout le bloc de code dans SSMS et y jouer avec. Les résultats incluent quelques colonnes supplémentaires pour nous aider à comprendre ce qui se passe. Cela m'a pris du temps avant de comprendre tout ce qui se passe avec PATINDEX (RegEx) et le CTE récursif.
la source
En utilisant une table de nombres générés par CTE pour examiner chaque caractère, puis FOR XML pour concaténer en une chaîne de valeurs conservées, vous pouvez ...
la source
la source
cette méthode n'a pas fonctionné pour moi car j'essayais de conserver les lettres arabes, j'ai essayé de remplacer l'expression régulière mais cela n'a pas fonctionné non plus. J'ai écrit une autre méthode pour travailler au niveau ASCII car c'était mon seul choix et cela a fonctionné.
ALLER
la source
Bien que le post soit un peu vieux, je voudrais dire ce qui suit. Le problème que j'ai eu avec la solution ci-dessus est qu'elle ne filtre pas les caractères comme ç, ë, ï, etc. J'ai adapté une fonction comme suit (je n'ai utilisé qu'une chaîne de 80 varchar pour économiser de la mémoire):
la source
Je viens de trouver cela intégré à Oracle 10g si c'est ce que vous utilisez. J'ai dû supprimer tous les caractères spéciaux pour comparer un numéro de téléphone.
la source