13

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

我在想

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

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

提前致谢

4

8 回答 8

18

理想情况下,您应该使用上面提到的 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)
于 2009-11-30T10:25:04.430 回答
12

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

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
于 2011-04-21T04:46:59.480 回答
7

我提出2个解决方案

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

例如

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

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

希望这可以帮助

于 2009-11-30T10:28:24.690 回答
3

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

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

于 2009-11-30T08:11:05.657 回答
1

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

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

于 2009-11-30T10:23:57.837 回答
1

我采用了 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
于 2018-06-20T08:36:20.753 回答
0

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

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

于 2009-11-30T08:22:14.403 回答
0

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

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

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

于 2011-01-21T01:08:25.117 回答