SQLServer中使用DISTINCT的大小写问题

SQLServer中使用DISTINCT的大小写问题,第1张

SQLServer中使用DISTINCT的大小写问题,第2张

SQL Server为您提供了在数据库中存储混合大小写数据的能力,但是根据您创建数据库的方式,当您发出T-SQL命令时,SQL Server将忽略大小写。您可能面临的一个问题是,您希望获得一个只包含表中不同值的列表,以显示表中的差异,但如果您的数据库是根据不区分大小写构建的,那么DISTINCT条件语句将不会显示这些差异,它只会将所有值放在一起。那么这方面有选择吗?
为了说明这个操作,我们将使用一个区分大小写的数据库和一个不区分大小写的数据库来看看它的两种工作方式。
第一组查询使用AdventureWorks数据库,该数据库被配置为区分大小写。要从数据库中获取集合,可以运行以下查询:
select name,collation _ name
from master . sys . databases
我们将查询Preson的数据。AdventureWorks数据库中的联系人。所有的数据都是混合构建的,所以当我们运行这个查询时,我们不会得到重复的值。
select distinct 10 first name
from person . contact
其中first name like ' a % '
order by 1
如果您更新记录并将first name从“Adam”更改为“ADAM ”,我们在运行此查询时将获得两个不同的值。
更新人员。contact
SET first name = ' ADAM '
WHERE contact id = 62
GO
SELECT DISTINCT 10 first name
From person . contact
WHERE first name like ' a % '
order by 1
如您所见,现在“ADAM”和“ADAM”显示为不同的值。
下一步我们将在不区分大小写的数据库中创建一个新表,然后从Person加载所有数据。接触到这个新表。
创建表test . dbo . contact(first name nvarchar(50))
GO
INSERT INTO test . dbo . contact
SELECT first name FROM Person。contact[/Br/]GO[/Br/]SELECT DISTINCT 10 first name[/Br/]FROM test . dbo . contact[/Br/]WHERE first name LIKE ' A % '[/Br/]ORDER BY 1[/Br/]GO[/Br/]当我们运行选择查询时,您可以看到输出将“Adam”与“ADAM”组合在一起,因为它不区分大小写。
为了解决这个问题,我们可以按照下面的方式修改这个查询,使这个集合在FirstName字段中区分大小写。
select distinct 10 first name collate SQL _ latin1 _ general _ cp1 _ cs _ as
from test . dbo . contact
其中first name like ' a % '
order by 1
运行此命令时,我们会看到值。
因此,根据数据库的设置,您可能会看到也可能看不到这种差异。
为了向您展示另一个示例,这里有一个快速选择区分大小写或不区分大小写选项的方法。
我们运行的第一个查询区分大小写,因此将显示所有四条记录。
select distinct(item)COLLATE SQL _ latin1 _ general _ cp1 _ cs _ as
FROM(
select ' ABCD ' item
Union all select ' ABCD '
Union all select ' defg '
Union all select ' defg ')items
第二个查询中不同的是集合的名称。当这个查询不区分大小写时,我们只得到两条记录。
select distinct(item)COLLATE SQL _ latin1 _ general _ cp1 _ ci _ ai
FROM(
select“ABCD”item
union all select“ABCD”
union all select“deFg”
union all select“deFg”)项

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » SQLServer中使用DISTINCT的大小写问题

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情