1
15
你要找的是要去掉的东西 Diacritics 从单个字符。恐怕您所拥有的解决方案将尽可能好,至少在纯SQL中是这样。dotnet/clr没有提供 a simple method 尽管如此。很抱歉,我知道您希望避免使用另一个CLR解决方案,但Microsoft SQL Server没有为此提供等效的T-SQL。 如果你幸运的话,你有 collation 在数据库中设置为“SQL拉丁1_general_cp1_ci_as”或以“SQL拉丁1_general”开头的任何变体。这相当于Windows-1252,非常好 documented . 通过查看每个字符并像以前一样使用SQL case语句映射一个等效字符,您将能够将每个字符“翻译”为英语等效字符。 不过,我对您的代码有一个快速更正。您将要在变量和参数中使用varchar。它产生了执行来回数据类型转换的额外开销,并有可能将仅以Unicode形式存在的Unicode字符引入到混合中。此外,还可以在 Bruce Schneier 的博客。 更新 有关音调符号和Windows国际化的一些重要信息,请参见 Michael S Kaplan 的博客。 |
2
96
实现这一目标的最佳方法是非常简单和高效:
输出“aeeohello!” 字符串不能是Unicode。如果您有一个nvarchar,在使用collate之前将其强制转换为varchar。 这里有一个函数可以满足操作需求:
然后,命令:
输出
|
3
6
这将替换所有重音字符… 结果:AEIOU 希望这对你有帮助! |
4
5
让我先澄清一下:您显示的重音字符实际上不是Unicode(正如一个答案所暗示的那样);它们是8位ASCII字符。需要记住的一件事是:您看到类似_¨和_的字符仅仅是因为这是您的代码页(操作系统和/或SQL Server使用的代码页[我不确定是哪一个])显示它们的方式。在不同的代码页中,这些字符将由完全不同的符号表示(例如,如果使用西里尔文或土耳其代码页)。 不管怎样,假设您想用与默认代码页最接近的US/Latin字符等价的字符替换这些8位字符[我假设这些字符来自拉丁字符集的某些变体]。这就是我处理类似问题的方式(免责声明:这不是一个非常优雅的解决方案,但我当时无法想到更好的解决方案): 创建一个UDF,将8位ASCII字符转换为7位可打印的ASCII等效字符,例如:
上面的代码是通用的,因此您可以调整字符映射以删除所有非字母字符,例如,您可以在可打印的7位ASCII字符的匹配中使用类似这样的代码(假定不区分大小写的排序规则):
要查看8位ASCII符号的字符映射是否正常工作,请运行以下代码:
现在,您可以创建一个UDF来处理字符串:
|
5
4
你可以避免硬编码
|
6
2
对于Unicode/UTF-X字符,没有直接映射“看起来类似”。除非有人有更酷的东西,否则我建议你采取蛮力的方法,这样你才能在那之前完成你的工作。 听起来你需要做两次传球。第一个步骤是先替换外观相似的字母,然后再遍历并删除所有剩余的非英语字母。 本文可以帮助您创建一个用户定义的函数,这样您就可以使用正则表达式而不是几十个替换调用: http://msdn.microsoft.com/en-us/magazine/cc163473.aspx 这是我为这个案子使用的字典:
|
7
2
嗯,这不是更好,但至少是TSQL集解决方案
|
8
1
在您的模式中有两个辅助表,您可以使用
首先声明一个视图来实现一个数字表,从1到65536。以下技术是由于 Itzik Ben-Gan :
接下来声明一个带有音调符号的字符和它们的非音调等位词之间的映射。此示例数据不是完整的映射,但用作示例:
最后声明一个包含测试数据的列的表。数据来源于问题和 DForck42's answer :
在这些对象就位后,以下
查询生成以下结果集:
|
9
1
我知道这并不优雅,但是当collate不起作用并且您不能使用函数时,您可以使用这个嵌套的替换来替换大多数使用的音调符号。我把这个贴出来,这样你就不用自己再打了:)
|
10
0
离我只有两美分
|
11
0
在Postgress 10中:
:) |
12
-1
|
Duvan · 将逗号(,)替换为点(.)[副本] 2 年前 |
Mateen Bagheri · 选择表的计数并选择其自身 2 年前 |
SoT · SQL Server中求和函数的工作方式 2 年前 |
NKAT · 将列值聚合到列表中会产生错误 2 年前 |
deanpillow · 返回两列中有一个匹配值的记录 2 年前 |
snowflakes74 · 在Dapper中异步查询多个结果 2 年前 |