Sql试图改变大小写字母和组相似的nvarchar值

时间:2009-08-05 13:26:02

标签: sql nvarchar

我正在使用sql server 2008,我正在尝试构建一个查询,用于显示单个sql表的一些整体结果。 我想显示每个日期的count(fieldname),例如我想知道每个日期在表中重复名称“izla”的频率,但它也可能是“IZLA”或“Izla”,所以我必须找到将这些数据组合为一个并找到其中三个数据的方法。

问题在于,如果我尝试使用大写或小写以便它们被自动地视为同样我有问题:当izla转换为上层时它变为İZLA或另一方面当IZLA转换为小写时它会被显示ızla。

最大的问题是如何将这些数据组合在一起?也许问题来自使用nvarchar,但我需要列类型(不能改变它)。

3 个答案:

答案 0 :(得分:2)

分组时,应使用Accent Insensitive排序规则。您可以将此直接添加到group by子句中。以下是一个例子:

Declare @Temp Table(Data nvarchar(100))

Insert Into @Temp Values(N'izla')
Insert Into @Temp Values(N'İZLA')
Insert Into @Temp Values(N'IZLA')
Insert Into @Temp Values(N'Izla')

Select  Data, 
        Count(*) 
From    @Temp 
Group By Data

Select  Data Collate Latin1_General_CI_AI, 
        Count(*) 
From    @Temp 
Group By Data Collate Latin1_General_CI_AI

运行此示例时,您将看到第一个查询创建了两行(计数为3且计数为1)。第二个示例使用重音不敏感排序规则进行分组,因此所有4个项目都组合在一起。

我在我的示例中使用了 Latin1_General_CI_AI 。我建议您检查正在使用的列的排序规则,然后通过将结尾的AS更改为AI来使用最匹配的排序规则。

答案 1 :(得分:0)

在小写

之后尝试用英语等效替换ı等

答案 2 :(得分:0)

这一切都归结为整理,这是系统对字符串数据进行排序的方式。

你可以这样说:

SELECT *, COUNT(*) OVER (PARTITION BY fieldname COLLATE Latin1_General_CI_AI), COUNT(*) OVER (PARTITION BY fieldname COLLATE Latin1_General_CI_AS)
FROM yourtable

这将为您提供一些很好的数字,每个名称出现在各种格式中的次数。有许多排序规则,您可以在联机丛书中搜索完整列表。例如,您可能也对Latin1_General_BIN感兴趣。

罗布