如何删除口音和所有字符<>在SQL服务器中的..

我需要对varchar(20)字段进行以下修改:

  1. 用普通字母replace口音(如è到e)
  2. (1)删除所有不在a..z中的字符

例如

'aèàç=.32s df' 

必须成为

 'aeacsdf' 

是否有特殊的存储function来实现这一点?

更新 :请提供一个T-SQL而不是CLR解决scheme。 这是我暂时做的解决方法,因为它暂时适合我的需求,无论如何,使用更优雅的方法会更好。

 CREATE FUNCTION sf_RemoveExtraChars (@NAME nvarchar(50)) RETURNS nvarchar(50) AS BEGIN declare @TempString nvarchar(100) set @TempString = @NAME set @TempString = LOWER(@TempString) set @TempString = replace(@TempString,' ', '') set @TempString = replace(@TempString,'à', 'a') set @TempString = replace(@TempString,'è', 'e') set @TempString = replace(@TempString,'é', 'e') set @TempString = replace(@TempString,'ì', 'i') set @TempString = replace(@TempString,'ò', 'o') set @TempString = replace(@TempString,'ù', 'u') set @TempString = replace(@TempString,'ç', 'c') set @TempString = replace(@TempString,'''', '') set @TempString = replace(@TempString,'`', '') set @TempString = replace(@TempString,'-', '') return @TempString END GO 

你正在寻找的东西是删除个别字符的变音符号 。 恐怕你的解决scheme将会像你所能得到的一样好,至less在纯SQL中。 尽pipe如此,dotNet / CLR确实提供了一个简单的方法 。 对不起,我知道你想要避免另一个CLR解决scheme,但是Microsoft SQL Server不提供与此相同的T-SQL。

如果幸运的话,可以将数据库中的sorting规则设置为“SQL_Latin1_General_CP1_CI_AS”或以“SQL_Latin1_General”开头的任何变体。 这相当于Windows-1252,这是非常有据可查的 。 通过查看字符并使用像您一样的SQL CASE语句映射等价物,您将能够将每个字符“翻译”为英文字符。

不过,我的代码有一个快速更正。 你将要在你的variables和参数中使用varchar。 它创build额外的开销执行数据types来回转换,并有可能引入unicode字符,只有unicode混合存在。 此外,在Bruce Schneier的博客上可以find与您的情况相关的安全相关原因。

更新有关Diacritics和Windows国际化的一些很好的信息可以在Michael S Kaplan的博客上find。

实现这一目标的最好方法是非常简单高效的:

 SELECT 'àéêöhello!' Collate SQL_Latin1_General_CP1253_CI_AI 

输出“aeeohello!”

该string不能是unicode。 如果你有一个nvarchar只是在使用collat​​e之前把它转换成varchar。

这是一个可以解决OP需求的function:

 create function [dbo].[RemoveExtraChars] ( @p_OriginalString varchar(50) ) returns varchar(50) as begin declare @i int = 1; -- must start from 1, as SubString is 1-based declare @OriginalString varchar(100) = @p_OriginalString Collate SQL_Latin1_General_CP1253_CI_AI; declare @ModifiedString varchar(100) = ''; while @i <= Len(@OriginalString) begin if SubString(@OriginalString, @i, 1) like '[aZ]' begin set @ModifiedString = @ModifiedString + SubString(@OriginalString, @i, 1); end set @i = @i + 1; end return @ModifiedString end 

然后,使用:

 select dbo.RemoveExtraChars('aèàç=.32s df') 

输出

 aeacsdf 

首先让我澄清一下:显示的重音字符实际上并不是Unicode(就像一个答案所暗示的); 这些是8位ASCII字符。 有一件事要记住:你看到像è和à这样的字符,因为这就是你的代码页(你的操作系统和/或SQL Server使用的代码页[我不确定哪一个]显示它们)。 在不同的代码页中,这些字符将由完全不同的符号表示(例如,如果使用西里尔语或土耳其语代码页)。

无论如何,假设你想用最接近的美国/拉丁字符代替你的默认代码页[我假设这些是来自拉丁字符集的一些变化的字符]这些8位字符。 这是我如何处理类似的问题(声明:这不是一个非常优雅的解决scheme,但当时我想不出什么更好的):

创build一个UDF,将8位ASCII字符转换为7位可打印的ASCII等效字符,例如:

 CREATE FUNCTION dbo.fnCharToAscii ( @Char AS VARCHAR ) RETURNS VARCHAR AS BEGIN IF (@Char IS NULL) RETURN '' -- Process control and DEL chars. IF (ASCII(@Char) < 32) OR (ASCII(@Char) = 127) RETURN '' -- Return printable 7-bit ASCII chars as is. -- UPDATE TO DELETE NON-ALPHA CHARS. IF (ASCII(@Char) >= 32) AND (ASCII(@Char) < 127) RETURN @Char -- Process 8-bit ASCII chars. RETURN CASE ASCII(@Char) WHEN 128 THEN 'E' WHEN 129 THEN '?' WHEN 130 THEN ',' WHEN 131 THEN 'f' WHEN 132 THEN ',' WHEN 133 THEN '.' WHEN 134 THEN '+' WHEN 135 THEN '+' WHEN 136 THEN '^' WHEN 137 THEN '%' WHEN 138 THEN 'S' WHEN 139 THEN '<' WHEN 140 THEN 'C' WHEN 141 THEN '?' WHEN 142 THEN 'Z' WHEN 143 THEN '?' WHEN 144 THEN '?' WHEN 145 THEN '''' WHEN 146 THEN '''' WHEN 147 THEN '"' WHEN 148 THEN '"' WHEN 149 THEN '-' WHEN 150 THEN '-' WHEN 151 THEN '-' WHEN 152 THEN '~' WHEN 153 THEN '?' WHEN 154 THEN 's' WHEN 155 THEN '>' WHEN 156 THEN 'o' WHEN 157 THEN '?' WHEN 158 THEN 'z' WHEN 159 THEN 'Y' WHEN 160 THEN ' ' WHEN 161 THEN 'i' WHEN 162 THEN 'c' WHEN 163 THEN 'L' WHEN 164 THEN '?' WHEN 165 THEN 'Y' WHEN 166 THEN '|' WHEN 167 THEN '$' WHEN 168 THEN '^' WHEN 169 THEN 'c' WHEN 170 THEN 'a' WHEN 171 THEN '<' WHEN 172 THEN '-' WHEN 173 THEN '-' WHEN 174 THEN 'R' WHEN 175 THEN '-' WHEN 176 THEN 'o' WHEN 177 THEN '+' WHEN 178 THEN '2' WHEN 179 THEN '3' WHEN 180 THEN '''' WHEN 181 THEN 'm' WHEN 182 THEN 'P' WHEN 183 THEN '-' WHEN 184 THEN ',' WHEN 185 THEN '1' WHEN 186 THEN '0' WHEN 187 THEN '>' WHEN 188 THEN '?' WHEN 189 THEN '?' WHEN 190 THEN '?' WHEN 191 THEN '?' WHEN 192 THEN 'A' WHEN 193 THEN 'A' WHEN 194 THEN 'A' WHEN 195 THEN 'A' WHEN 196 THEN 'A' WHEN 197 THEN 'A' WHEN 198 THEN 'A' WHEN 199 THEN 'C' WHEN 200 THEN 'E' WHEN 201 THEN 'E' WHEN 202 THEN 'E' WHEN 203 THEN 'E' WHEN 204 THEN 'I' WHEN 205 THEN 'I' WHEN 206 THEN 'I' WHEN 207 THEN 'I' WHEN 208 THEN 'D' WHEN 209 THEN 'N' WHEN 210 THEN 'O' WHEN 211 THEN 'O' WHEN 212 THEN 'O' WHEN 213 THEN 'O' WHEN 214 THEN 'O' WHEN 215 THEN 'x' WHEN 216 THEN 'O' WHEN 217 THEN 'U' WHEN 218 THEN 'U' WHEN 219 THEN 'U' WHEN 220 THEN 'U' WHEN 221 THEN 'Y' WHEN 222 THEN 'b' WHEN 223 THEN 'B' WHEN 224 THEN 'a' WHEN 225 THEN 'a' WHEN 226 THEN 'a' WHEN 227 THEN 'a' WHEN 228 THEN 'a' WHEN 229 THEN 'a' WHEN 230 THEN 'a' WHEN 231 THEN 'c' WHEN 232 THEN 'e' WHEN 233 THEN 'e' WHEN 234 THEN 'e' WHEN 235 THEN 'e' WHEN 236 THEN 'i' WHEN 237 THEN 'i' WHEN 238 THEN 'i' WHEN 239 THEN 'i' WHEN 240 THEN 'o' WHEN 241 THEN 'n' WHEN 242 THEN 'o' WHEN 243 THEN 'o' WHEN 244 THEN 'o' WHEN 245 THEN 'o' WHEN 246 THEN 'o' WHEN 247 THEN '-' WHEN 248 THEN 'o' WHEN 249 THEN 'u' WHEN 250 THEN 'u' WHEN 251 THEN 'u' WHEN 252 THEN 'u' WHEN 253 THEN 'y' WHEN 254 THEN 'b' WHEN 255 THEN 'y' END RETURN '' END 

上面的代码是通用的,因此您可以调整字符映射以删除所有非字母字符,例如,您可以在可打印的7位ASCII字符(假定不区分大小写的sorting规则)匹配中使用类似的代码:

 IF @Char NOT LIKE '[az]' RETURN '' 

要查看您的8位ASCII符号的字符映射是否正常工作,请运行以下代码:

 DECLARE @I INT DECLARE @Msg VARCHAR(32) SET @I = 128 WHILE @I < 256 BEGIN SELECT @Msg = CAST(@I AS VARCHAR) + ': ' + CHAR(@I) + '=' + dbo.fnCharToAscii(CHAR(@I)) PRINT @Msg SET @I = @I + 1 END 

现在你可以创build一个UDF来处理一个string:

 CREATE FUNCTION dbo.fnStringToAscii ( @Value AS VARCHAR(8000) ) RETURNS VARCHAR(8000) AS BEGIN IF (@Value IS NULL OR DATALENGTH(@Value) = 0) RETURN '' DECLARE @Index INT DECLARE @Result VARCHAR(8000) SET @Result = '' SET @Index = 1 WHILE (@Index <= DATALENGTH(@Value)) BEGIN SET @Result = @Result + dbo.fnCharToAscii(SUBSTRING(@Value, @Index, 1)) SET @Index = @Index + 1 END RETURN @Result END GO 

您可以避免使用硬编码的REPLACE语句,方法是使用带重音不敏感sorting规则的COLLATE子句将重音字母字符与非字母sorting字符进行比较:

 DECLARE @s1 NVARCHAR(200), @s2 NVARCHAR(200) SET @s1 = N'aèàç=.32s df' SET @s2 = N'' SELECT @s2 = @s2 + no_accent FROM ( SELECT SUBSTRING(@s1, number, 1) AS accent, number FROM master.dbo.spt_values WHERE TYPE = 'P' AND number BETWEEN 1 AND LEN(@s1) ) s1 INNER JOIN ( SELECT NCHAR(number) AS no_accent FROM master.dbo.spt_values WHERE type = 'P' AND (number BETWEEN 65 AND 90 OR number BETWEEN 97 AND 122) ) s2 ON s1.accent COLLATE LATIN1_GENERAL_CS_AI = s2.no_accent ORDER BY number SELECT @s1 SELECT @s2 /* aèàç=.32s df aeacsdf */ 
  SELECT 'áéíóú' COLLATE Cyrillic_General_CI_AI 

这将取代所有重音的字符…

结果:aeiou

希望这对你有所帮助!

AFAIK,没有一个“看起来相似”的unicode / UTF-X字符的直接映射。 除非有人有更酷的东西,否则我会build议采取暴力手段,以便在此之前完成工作。

这听起来像你需要做2遍。 第一遍是先replace看起来相似的字母,然后再去掉所有剩下的非英文字母。

本文可以帮助您创build用户定义的函数,以便您可以使用正则expression式而不是几十个REPLACE调用: http : //msdn.microsoft.com/en-us/magazine/cc163473.aspx

这是我一直在使用的字典,

  public static Dictionary<char, string> NonEnglishLetterMapping = new Dictionary<char, string> { {'a', "áàâãäåāăą"} //, {'b', ""} , {'c', "ćĉċč"} , {'d', "ďđ"} , {'e', "éëêèēĕėę"} //, {'f', ""} , {'g', "ĝğġģ"} , {'h', "ĥħ"} , {'i', "ìíîïĩīĭįı"} , {'j', "ĵ"} , {'k', "ķĸ"} , {'l', "ĺļľŀł"} //, {'m', ""} , {'n', "ñńņňʼnŋ"} , {'o', "òóôõöōŏőơ"} //, {'p', ""} //, {'q', ""} , {'r', "ŕŗř"} , {'s', "śŝşšș"} , {'t', "ţťŧț"} , {'u', "ùúûüũūŭůűųư"} //, {'v', ""} , {'w', "ŵ"} //, {'x', ""} , {'y', "ŷ"} , {'z', "źżž"} }; 

那么,这不是一个更好的,但至less是一个TSQL的解决scheme

 declare @TempString varchar(100) set @TempString='textàè containing éìòaccentsç''''` and things-' select @TempString= replace( replace( replace( replace( replace( replace( replace( replace( replace( replace( replace(@TempString,' ', '') ,'à', 'a') ,'è', 'e') ,'é', 'e') ,'ì', 'i') ,'ò', 'o') ,'ù', 'u') ,'ç', 'c') ,'''', '') ,'`', '') ,'-', '') select @TempString 

在模式中有两个辅助表,您可以使用一个SELECT语句来转换数据。

首先声明一个数字表,从1到65536.下面的技术是由于Itzik Ben-Gan :

 CREATE VIEW Sequence AS WITH T1(_) AS (SELECT NULL UNION ALL SELECT NULL), T2(_) AS (SELECT NULL FROM T1 AS L CROSS JOIN T1 AS R), T3(_) AS (SELECT NULL FROM T2 AS L CROSS JOIN T2 AS R), T4(_) AS (SELECT NULL FROM T3 AS L CROSS JOIN T3 AS R), T5(_) AS (SELECT NULL FROM T4 AS L CROSS JOIN T4 AS R) SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS Number FROM T5; 

接下来,声明人物与变音符号之间的映射,以及他们的不符合条件的变体。 这个示例数据不是完整的映射,而是作为一个例子:

 CREATE TABLE UndiacriticMap ( DiacriticCharacter CHAR(1) NOT NULL PRIMARY KEY, UndiacriticCharacter CHAR(1) NOT NULL ); INSERT INTO UndiacriticMap ( DiacriticCharacter, UndiacriticCharacter ) VALUES ('à', 'a'), ('è', 'e'), ('é', 'e'), ('ì', 'i'), ('ò', 'o'), ('ç', 'c'); 

最后用包含testing数据的列声明一个表。 数据来源于DForck42的答案 :

 CREATE TABLE TestData ( ID INT NOT NULL PRIMARY KEY, String VARCHAR(50) NOT NULL ); INSERT INTO TestData ( ID, String ) VALUES (1, 'textàè containing éìòaccentsç''''` and things-'), (2, 'aèàç=.32s df'); 

有了这些对象,下面的SELECT语句就会以关系的方式处理testing数据,除非是非关系型的hack将字符连接在一起。 “ 黑匣子 XML方法”是由于Anith Sen :

 WITH CharacterWise (ID, Symbol, Position) AS ( SELECT ID, SUBSTRING(TestData.String, Sequence.Number, 1), Sequence.Number FROM TestData INNER JOIN Sequence ON Sequence.Number <= LEN(TestData.String) ), Stripped (ID, Symbol, Position) AS ( SELECT ID, CASE WHEN UndiacriticMap.DiacriticCharacter IS NOT NULL THEN UndiacriticMap.UndiacriticCharacter ELSE CASE WHEN CharacterWise.Symbol LIKE '[az]' COLLATE Latin1_General_BIN THEN CharacterWise.Symbol ELSE '' END END, CharacterWise.Position FROM CharacterWise LEFT OUTER JOIN UndiacriticMap ON UndiacriticMap.DiacriticCharacter = CharacterWise.Symbol ) SELECT TestData.ID, TestData.String, ( SELECT Stripped.Symbol AS [text()] FROM Stripped WHERE TestData.ID = Stripped.ID ORDER BY Stripped.Position FOR XML PATH('') ) AS StrippedString FROM TestData; 

该查询生成以下结果集:

 ID String StrippedString ----------- -------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 1 textàè containing éìòaccentsç''` and things- textaecontainingeioaccentscandthings 2 aèàç=.32s df aeacsdf 

我知道这不是优雅的,但当collat​​e不工作,你不能使用的function,你可以使用这个嵌套replace大多数使用的变音符号。 我张贴这个,所以你不必再键入它自己:)

 select REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(myfield,'é','e'),'ê','e'),'ë','e'),'è','e'),'É','E'),'È','E'),'Ê','E'),'Ë','E'),'ð','D'),'Ð','D'),'â','a'),'à','a'),'á','a'),'ã','a'),'æ','a'),'à','a'),'å','a'),'Å','A'),'À','A'),'Á','A'),'Â','A'),'Ã','A'),'Æ','A'),'ä','a'),'Ä','A'),'ï','i'),'î','i'),'ì','i'),'í','i'),'Ì','I'),'Í','I'),'Î','I'),'Ï','I'),'ô','o'),'ò','o'),'ó','o'),'õ','o'),'ø','o'),'Ò','O'),'Ó','O'),'Ô','O'),'Õ','O'),'Ø','O'),'ö','o'),'Ö','O'),'û','u'),'ù','u'),'ú','u'),'Ù','U'),'Ú','U'),'Û','U'),'Ü','U'),'ü','u'),'ñ','n'),'Ñ','N'),'Ç','C'),'ç','c'),'ý','y'),'ÿ','y'),'Ý','Y'),'þ','T'),'Þ','t'),'ß','ss') from mytable 

我只有两分钱

 select * From XXX where cast(word as varchar(max)) collate SQL_Latin1_General_CP1253_CI_AI = 'sluiten' collate SQL_Latin1_General_CP1253_CI_AI 
 select * from database_name.table_name where countries LIKE '%é%' or countries like'%é%' or countries like'%ê%' or countries like'%ë%' or countries like'%è%' or countries like'%É%' or countries like'%È%' or countries like'%Ê%' or countries like'%Ë%' or countries like'%ð%' or countries like'%Ð%' or countries like'%â%' or countries like'%à%' or countries like'%á%' or countries like'%ã%' or countries like'%æ%' or countries like'%à%' or countries like'%å%' or countries like'%Å%' or countries like'%À%' or countries like'%Á%' or countries like'%Â%' or countries like'%Ã%' or countries like'%Æ%' or countries like'%ä%' or countries like'%Ä%' or countries like'%ï%' or countries like'%î%' or countries like'%ì%' or countries like'%í%' or countries like'%Ì%' or countries like'%Í%' or countries like'%Î%' or countries like'%Ï%' or countries like'%ô%' or countries like'%ò%' or countries like'%ó%' or countries like'%õ%' or countries like'%ø%' or countries like'%Ò%' or countries like'%Ó%' or countries like'%Ô%' or countries like'%Õ%' or countries like'%Ø%' or countries like'%ö%' or countries like'%Ö%' or countries like'%û%' or countries like'%ù%' or countries like'%ú%' or countries like'%Ù%' or countries like'%Ú%' or countries like'%Û%' or countries like'%Ü%' or countries like'%ü%' or countries like'%ñ%' or countries like'%Ñ%' or countries like'%Ç%' or countries like'%ç%' or countries like'%ý%' or countries like'%ÿ%' or countries like'%Ý%' or countries like'%þ%' or countries like'%Þ%' or countries like'%ß%';