Regex motif à l'intérieur de SQL fonction Remplacer?
SELECT REPLACE('<strong>100</strong><b>.00 GB', '%^(^-?\d*\.{0,1}\d+$)%', '');
Je veux remplacer n'importe quelle balise entre les deux parties de la le nombre au-dessus de la regex, mais il ne semble pas fonctionner. Je ne suis pas sûr si c'est la regex de la syntaxe, c'est faux parce que j'ai essayé, plus simple, comme '%[^0-9]%'
juste pour tester, mais il ne fonctionne pas non plus. Quelqu'un sait-il comment puis-je y parvenir?
- Vous pourriez vouloir revisiter la réponse.
- Que voulez-vous le résultat final de l'être? Attendez-vous
100.00
ou100.00 GB
? Et il y a d'autres exemples de mise en forme des numéros qui ne correspondent pas au modèle du marquage en cours autour de la partie à gauche de la virgule? Peut balisage être autour de l'ensemble du numéro, par exemple100<i>.00</i> GB
? Est-il toujours 2 caractères code de la devise sur la droite? - Je veux le nombre avec point décimal si il y en a, pas toutes les valeurs ont, eux aussi, il n'y a pratiquement pas de modèle pour ces car elle est générée, mais de tiers générateur de code html. Parfois, la monnaie est en avant, parfois après la nombre de, parfois, il est symbole$, parfois, le code - USD, avec -sans espaces.. etc etc . tout simplement très ordures de données
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser PATINDEX
pour trouver le premier indice de la forme (chaîne) de l'événement. Ensuite, utilisez TRUCS à des choses d'une autre chaîne dans le modèle(chaîne) appariés.
En boucle sur chaque ligne. Remplacer chaque caractère illégal de ce que vous voulez. Dans votre cas, remplacez non numérique avec vide. La boucle intérieure est si vous avez plus d'un caractère illégal dans une cellule de la boucle.
Attention: C'est lent quand même!! Avoir une colonne de type varchar peut avoir un impact. Donc, en utilisant LTRIM RTRIM peut aider un peu. Peu importe, il est lent.
De crédit va à cette StackOverFlow réponse.
MODIFIER
Le mérite en revient aussi à @srutzky
Modifier (par @Tmdean)
Au lieu de faire une ligne à la fois, cette réponse peut être adapté à une série de plus à base de solution. - Il encore itère le max du nombre de caractères non numériques dans une seule ligne, donc il n'est pas l'idéal, mais je pense qu'il devrait être acceptable dans la plupart des situations.
Vous pouvez également améliorer l'efficacité de beaucoup si vous conservez un peu de colonne dans le tableau qui indique si la zone a été nettoyée encore. (NULL représente "Inconnu" dans mon exemple et doit être la colonne par défaut.)
Si vous ne voulez pas changer votre schéma, c'est facile de s'adapter à stocker des résultats intermédiaires dans une table d'une valeur de la variable qui est appliqué à la table à la fin.
[^0-9.]
. Si non, alors vous bande de hors la virgule et ce qui devait être100.00
en10000
.Dans un sens général, SQL Server ne prend pas en charge les expressions régulières, et vous ne pouvez pas les utiliser dans les natifs du code T-SQL.
Vous pouvez écrire une fonction CLR pour le faire. Voir ici, par exemple.
Au lieu d'éliminer la trouvé de caractères par sa seule position, à l'aide de
Replace(Column, BadFoundCharacter, '')
pourrait être sensiblement plus rapide. En outre, au lieu de simplement remplacer l'un de mauvais caractère suivant dans chaque colonne, il remplace tous ceux trouvés.Je suis convaincu que cela fonctionne mieux que l'accepté de répondre, si seulement parce qu'il fait moins d'opérations. Il y a d'autres moyens qui pourraient également être plus rapide, mais je n'ai pas le temps d'explorer ceux-ci maintenant.
Replace(Column, Substring(Column, PatIndex('%[^0-9.-]%', Column), 1), '')
peu sur une requête de sélection. Donc, merci!Je suis tombé sur ce post la recherche de quelque chose d'autre, mais pensé que je le mentionne une solution j'utilise qui est beaucoup plus efficace et vraiment devrait être la valeur par défaut de la mise en œuvre d'une fonction, lorsqu'il est utilisé avec un jeu basé sur une requête qui consiste à utiliser une croix appliquée en fonction de table. Semble que le sujet est toujours actif, alors j'espère que c'est utile à quelqu'un.
Exemple d'exécution sur quelques unes des réponses jusqu'à présent basée sur l'exécution de récursive définir en fonction des requêtes ou d'une fonction scalaire, basé sur 1m de lignes du jeu de test en supprimant les caractères à partir d'un hasard newid, varie de 34 à 2m05s pour la boucle WHILE exemples et de 1m3s à {toujours} pour des exemples de fonction.
À l'aide d'une fonction de table avec la croix appliquer atteint le même but dans 10s. Vous devrez peut-être ajuster en fonction de vos besoins tels que la longueur maximum qu'il traite.
Fonction:
Utilisation:
Voici une fonction que j'ai écrit pour accomplir cette basés sur les réponses précédentes.
Gist
Edit:
À l'origine, j'avais une fonction récursive, ici, qui n'a pas bien jouer avec sql server en tant qu'il a un 32 limite de niveau d'imbrication qui aboutirait à une erreur semblable à celui ci-dessous toutes les fois que vous essayez de faire 32+ remplacements avec la fonction. Au lieu d'essayer de faire un serveur de changement de niveau pour permettre à plus de nidification (qui pourrait être dangereux, comme permettent de ne jamais se terminant boucles) de commutation à une boucle while fait beaucoup plus de sens.
Maximale de la procédure stockée, une fonction, un déclencheur ou une vue de niveau d'imbrication dépassé (limite de 32).
Emballage de la solution à l'intérieur d'une fonction SQL pourrait être utile si vous voulez le réutiliser.
Je suis à même de le faire au niveau de la cellule, c'est pourquoi je suis en train de mettre cela comme une réponse différente:
Si vous faites cela juste pour un paramètre dans une Procédure Stockée, vous pouvez utiliser les éléments suivants:
Je pense, plus simple et plus rapide approche est itéré de chaque caractère de l'alphabet:
J'ai créé cette fonction pour nettoyer une chaîne de caractères contenue non caractères numériques dans un champ de temps. Le temps contenait des points d'interrogation quand ils n'ont pas ajouté les minutes, quelque chose comme 20:??. Fonction boucle de chaque personnage et remplace l' ? avec un 0 :