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

Posted

技术标签:

【中文标题】SQL Server:如何从字段中删除标点符号?【英文标题】:SQL Server: How do you remove punctuation from a field? 【发布时间】:2010-12-21 13:33:21 【问题描述】:

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

我在想

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

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

提前致谢

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

可能是你的环境不能使用CLR @Sohnee - 感谢您的快速回复。我还没有尝试过这种方法,因为我需要在全文索引中使用这些数据,我在想如果我使用它,我将无法使列持久化。那是对的吗?虽然我肯定会在下次可行时尝试类似的东西。谢谢。【参考方案2】:

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

它既快速又简单,您不必经历设置 CLR 存储过程然后自己清理的过程。

【讨论】:

非常感谢,在这种情况下这不是一件事情,但这是我将来使用的一个好看的工具。干杯。【参考方案3】:

我会将它包装在一个简单的标量 UDF 中,以便在再次需要时将所有字符串清理都放在一个地方。

那么你也可以在 INSERT 上使用它...

【讨论】:

【参考方案4】:

理想情况下,您应该使用上面提到的 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)

【讨论】:

@TimC:非常感谢我喜欢这个解决方案并实现了它,但遇到了一个问题。一旦我取出标点符号,我打算在一个持久化的计算列中使用它,这样我就可以在它上面创建一个全文索引。但是我无法保留使用此方法的列。有什么想法吗?【参考方案5】:

我提出了 2 个解决方案

方案一:制作噪音表,用空格代替噪音

例如

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

注意-我刚刚放了一些噪音。你可能需要放你需要的噪音。

希望对你有帮助

【讨论】:

@pewned。非常感谢。我最终使用了不同的想法,但这有效并回答了我的问题。不过,给你一个问题,我需要在一个持久化的计算列中使用这些数据,但我不能在那里持久化它。有任何想法吗?我可能会为此提出一个新问题。再次感谢。【参考方案6】:

您不能使用 PATINDEX 仅包含数字和字母,而不是尝试猜测该字段中可能包含的标点符号吗? (不想刻薄,如果我已经准备好代码,我会分享它......但这就是我正在寻找的)。

您似乎需要创建一个自定义函数以避免查询中出现大量替换函数 - 这是一个很好的示例:

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

【讨论】:

【参考方案7】:

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

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

【讨论】:

我认为留下空格的注释行是DECLARE @BadChars VARCHAR(13) = '%[^ a-z0-9]%'【参考方案8】:

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

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

输出:

Thisisonlyatéstreally

【讨论】:

以上是关于SQL Server:如何从字段中删除标点符号?的主要内容,如果未能解决你的问题,请参考以下文章

SQL SERVER 2005删除重复数据

sql server 2000 中怎么去掉 和 还原 自增字段

如何从 winston@3 记录器输出中删除 [符号] 字段?

sql server中如何写脚本为数据表增加一个字段

sql server如何将字段添加到第一列

如何从 drupal 视图中的字段中删除 HTML