SQL Server:如何从字段中删除标点符号?

时间:2009-11-30 08:05:09

标签: sql sql-server tsql replace punctuation

任何人都知道从SQL Server中的字段中删除标点符号的好方法吗?

我在想

UPDATE tblMyTable SET FieldName = REPLACE(REPLACE(REPLACE(FieldName,',',''),'.',''),'''' ,'')

但是当我打算删除大量不同的字符时,似乎有点单调乏味,例如:!@#$%^& *()<>:“

提前致谢

8 个答案:

答案 0 :(得分:16)

理想情况下,您可以使用C#+ LINQ等应用程序语言执行此操作。

如果你想纯粹在T-SQL中这样做,那么最简单的方法就是首先创建一个包含你想删除的所有标点符号的表。

CREATE TABLE Punctuation 
(
    Symbol VARCHAR(1) NOT NULL
)

INSERT INTO Punctuation (Symbol) VALUES('''')
INSERT INTO Punctuation (Symbol) VALUES('-')
INSERT INTO Punctuation (Symbol) VALUES('.')

接下来,您可以在SQL中创建一个函数,以从输入字符串中删除所有标点符号。

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

然后你可以在UPDATE语句中调用该函数

UPDATE tblMyTable SET FieldName = dbo.fn_RemovePunctuation(FieldName)

答案 1 :(得分:9)

我想避免创建一个表,并希望删除除字母和数字之外的所有内容。

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

答案 2 :(得分:6)

我提议2个解决方案

解决方案1:制作噪音表并用空格替换噪音

e.g。

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

解决方案2:使用数字表

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,'&#x20;',SPACE(1)) Data from 
(select SUBSTRING(@String,rn,1) 
from numbercte  
where SUBSTRING(@String,rn,1) not in('!','*','>','<','%','(',')',':','!','&','@','#','$')

for xml path(''))X(FilteredData)

输出(两种情况)

数据

hello  how   are  u  . I am ok . Oh nice

注意 - 我刚刚发出了一些噪音。您可能需要发出您需要的噪音。

希望这有帮助

答案 3 :(得分:3)

您可以在SQL Server中使用正则表达式 - 这是一篇基于SQL 2005的文章:

http://msdn.microsoft.com/en-us/magazine/cc163473.aspx

答案 4 :(得分:1)

我将它包装在一个简单的标量UDF中,因此如果再次需要,所有字符串清理都在一个地方。

然后你也可以在INSERT上使用它......

答案 5 :(得分:0)

如果这是一次性的话,我会在LINQPad中使用C#+ LINQ片段来完成正则表达式的工作。

快速简便,您无需经历设置CLR存储过程然后自行清理的过程。

答案 6 :(得分:0)

你不能使用PATINDEX只包含NUMBERS和LETTERS,而不是试图猜测字段中可能有什么标点符号吗? (不要试图嗤之以鼻,如果我已准备好代码,我会分享它......但这正是我正在寻找的。)

似乎你需要创建一个自定义函数,以避免查询中有一个巨大的替换函数列表 - 这是一个很好的例子:

http://www.codeproject.com/KB/database/SQLPhoneNumbersPart_2.aspx?display=Print

答案 7 :(得分:0)

我采用了Ken MC的解决方案,并将其变成可以用给定字符串替换所有标点符号的函数:

XXXConfig.cmake

输出:

----------------------------------------------------------------------------------------------------------------
-- 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..', '');