SQL Server: Comment supprimer la ponctuation d'un champ?
-
10-07-2019 - |
Question
Quelqu'un connaît-il un bon moyen de supprimer la ponctuation d'un champ dans SQL Server?
je pense
UPDATE tblMyTable SET FieldName = REPLACE(REPLACE(REPLACE(FieldName,',',''),'.',''),'''' ,'')
mais cela semble un peu fastidieux lorsque je compte supprimer un grand nombre de caractères différents, par exemple:! @ # #%% ^ & amp; * () < >: quot;
Merci d'avance
La solution
Idéalement, vous le feriez dans un langage d'application tel que C # + LINQ, comme mentionné ci-dessus.
Si vous souhaitez le faire uniquement dans T-SQL, vous pouvez tout d’abord créer un tableau contenant toutes les ponctuations que vous souhaitez supprimer.
CREATE TABLE Punctuation
(
Symbol VARCHAR(1) NOT NULL
)
INSERT INTO Punctuation (Symbol) VALUES('''')
INSERT INTO Punctuation (Symbol) VALUES('-')
INSERT INTO Punctuation (Symbol) VALUES('.')
Ensuite, vous pouvez créer une fonction en SQL pour supprimer tous les symboles de ponctuation d'une chaîne d'entrée.
CREATE FUNCTION dbo.fn_RemovePunctuation
(
@InputString VARCHAR(500)
)
RETURNS VARCHAR(500)
AS
BEGIN
SELECT
@InputString = REPLACE(@InputString, P.Symbol, '')
FROM
Punctuation P
RETURN @InputString
END
GO
Ensuite, vous pouvez simplement appeler la fonction dans votre instruction UPDATE
UPDATE tblMyTable SET FieldName = dbo.fn_RemovePunctuation(FieldName)
Autres conseils
Je voulais éviter de créer un tableau et je voulais tout supprimer, sauf les lettres et les chiffres.
DECLARE @p int
DECLARE @Result Varchar(250)
DECLARE @BadChars Varchar(12)
SELECT @BadChars = '%[^a-z0-9]%'
-- to leave spaces - SELECT @BadChars = '%[^a-z0-9] %'
SET @Result = @InStr
SET @P =PatIndex(@BadChars,@Result)
WHILE @p > 0 BEGIN
SELECT @Result = Left(@Result,@p-1) + Substring(@Result,@p+1,250)
SET @P =PatIndex(@BadChars,@Result)
END
Je propose 2 solutions
Solution 1: créez une table de bruit et remplacez les bruits par des espaces vides
par exemple
DECLARE @String VARCHAR(MAX)
DECLARE @Noise TABLE(Noise VARCHAR(100),ReplaceChars VARCHAR(10))
SET @String = 'hello! how * > are % u (: . I am ok :). Oh nice!'
INSERT INTO @Noise(Noise,ReplaceChars)
SELECT '!',SPACE(1) UNION ALL SELECT '@',SPACE(1) UNION ALL
SELECT '#',SPACE(1) UNION ALL SELECT '$',SPACE(1) UNION ALL
SELECT '%',SPACE(1) UNION ALL SELECT '^',SPACE(1) UNION ALL
SELECT '&',SPACE(1) UNION ALL SELECT '*',SPACE(1) UNION ALL
SELECT '(',SPACE(1) UNION ALL SELECT ')',SPACE(1) UNION ALL
SELECT '{',SPACE(1) UNION ALL SELECT '}',SPACE(1) UNION ALL
SELECT '<',SPACE(1) UNION ALL SELECT '>',SPACE(1) UNION ALL
SELECT ':',SPACE(1)
SELECT @String = REPLACE(@String, Noise, ReplaceChars) FROM @Noise
SELECT @String Data
Solution 2: avec une table numérique
DECLARE @String VARCHAR(MAX)
SET @String = 'hello! & how * > are % u (: . I am ok :). Oh nice!'
;with numbercte as
(
select 1 as rn
union all
select rn+1 from numbercte where rn<LEN(@String)
)
select REPLACE(FilteredData,' ',SPACE(1)) Data from
(select SUBSTRING(@String,rn,1)
from numbercte
where SUBSTRING(@String,rn,1) not in('!','*','>','<','%','(',')',':','!','&','@','#','$')
for xml path(''))X(FilteredData)
Sortie (les deux cas)
Données
hello how are u . I am ok . Oh nice
Remarque: je viens de mettre quelques-uns des bruits. Vous devrez peut-être mettre les bruits dont vous avez besoin.
J'espère que cela vous aidera
Vous pouvez utiliser des expressions régulières dans SQL Server. Voici un article basé sur SQL 2005:
Je l'envelopperais dans un fichier UDF scalaire simple afin que tout le nettoyage des chaînes se fasse au même endroit si nécessaire.
Ensuite, vous pouvez aussi l'utiliser sur INSERT ...
S'il s'agit d'une opération ponctuelle, j'utiliserais un extrait de code C # + LINQ dans LINQPad faire le travail avec des expressions régulières.
C’est simple et rapide et vous n’aurez pas à suivre le processus de configuration d’une procédure stockée CLR, puis de le nettoyer après vous-même.
Ne pouvez-vous pas utiliser PATINDEX pour n’inclure que NUMBERS et LETTER au lieu d’essayer de deviner la ponctuation possible sur le terrain? (Je n'essaie pas d'être sournois, si j'avais le code prêt, je le partagerais ... mais c'est ce que je cherche.)
Il semble que vous deviez créer une fonction personnalisée afin d'éviter une liste géante de fonctions de remplacement dans vos requêtes. En voici un bon exemple:
http://www.codeproject.com/KB/database/ SQLPhoneNumbersPart_2.aspx? Display = Imprimer
J'ai pris la solution de Ken MC et l'ai transformée en une fonction qui peut remplacer toute ponctuation par une chaîne donnée:
----------------------------------------------------------------------------------------------------------------
-- This function replaces all punctuation in the given string with the "replaceWith" string
----------------------------------------------------------------------------------------------------------------
IF object_id('[dbo].[fnReplacePunctuation]') IS NOT NULL
BEGIN
DROP FUNCTION [dbo].[fnReplacePunctuation];
END;
GO
CREATE FUNCTION [dbo].[fnReplacePunctuation] (@string NVARCHAR(MAX), @replaceWith NVARCHAR(max))
RETURNS NVARCHAR(MAX)
BEGIN
DECLARE @Result Varchar(max) = @string;
DECLARE @BadChars Varchar(12) = '%[^a-z0-9]%'; -- to leave spaces - SELECT @BadChars = '%[^a-z0-9] %'
DECLARE @p int = PatIndex(@BadChars,@Result);
DECLARE @searchFrom INT;
DECLARE @indexOfPunct INT = @p;
WHILE @indexOfPunct > 0 BEGIN
SET @searchFrom = LEN(@Result) - @p;
SET @Result = Left(@Result, @p-1) + @replaceWith + Substring(@Result, @p+1,LEN(@Result));
SET @IndexOfPunct = PatIndex(@BadChars, substring(@Result, (LEN(@Result) - @SearchFrom)+1, LEN(@Result)));
SET @p = (LEN(@Result) - @searchFrom) + @indexOfPunct;
END
RETURN @Result;
END;
GO
-- example:
SELECT dbo.fnReplacePunctuation('This is, only, a tést-really..', '');
Sortie:
Thisisonlyatéstreally