SQL Server中使用DISTINCT的大小写问题

 SQL Server为你提供了在你的数据库中存储混合大小写数据的能力,但是根据你怎样创建数据库,SQL Server将在你给出T-SQL命令时忽视大小写。你可能面对的一个问题是你想从一个表获得只包含不同值的列表,来显示你的表中不同,但是如果你的数据库是按照不区分大小写来建立的,那么DISTINCT条件语句不会显示这些不同,它只会将所有的值放在一起。所以在这方面有什么选择吗?

  专家解答

  为了说明这个动作,我们将使用一个区分大小写和一个不区分大小写的数据库来看看它工作的两种方式。

  第一组查询使用了AdventureWorks数据库,它被配置为区分大小写。为了得到从你的数据库而来的集合,你可以运行这个查询:


  SELECT name, collation_name
  FROM master.sys.databases

  我们将查询AdventureWorks数据库中的Preson.Contact的数据。所有的数据都是作为混合大小写来建立的,所以当我们运行这个查询的时候我们没有得到重复的值。


  SELECT DISTINCT TOP 10 FirstName
  FROM Person.Contact
  WHERE FirstName LIKE 'A%'
  ORDER BY 1

在区分大小写的SQL Server数据库中使用DISTINCT的问题

  如果你更新一条记录并将FirstName从“Adam”改为“ADAM”,那么当运行这个查询时我们会获得两个不同的值。


  UPDATE Person.Contact
  SET FirstName = 'ADAM'
  WHERE ContactID = 62
  GO
  SELECT DISTINCT TOP 10 FirstName
  FROM Person.Contact
  WHERE FirstName LIKE 'A%'
  ORDER BY 1

  正如你看到的,现在“Adam”和“ADAM”作为不同的值来显示。

在区分大小写的SQL Server数据库中使用DISTINCT的问题

  下一步我们将要做的是在一个不区分大小写的数据库中创建一个新表然后从Person.Contact加载所有的数据到这个新表中。


  CREATE TABLE Test.dbo.contact (FirstName nvarchar(50))
  GO
  INSERT INTO Test.dbo.contact
  SELECT FirstName FROM Person.Contact
  GO
  SELECT DISTINCT TOP 10 FirstName
  FROM Test.dbo.contact
  WHERE FirstName LIKE 'A%'
  ORDER BY 1
  GO

  当我们运行SELECT查询时你可以看到输出将“Adam”和“ADAM”结合起来,因为不区分大小写。

在区分大小写的SQL Server数据库中使用DISTINCT的问题

  为了解决这个问题我们可以将这个查询按照下面的方式修改使得这个收集在FirstName字段上区分大小写。


  SELECT DISTINCT TOP 10 FirstName COLLATE sql_latin1_general_cp1_cs_as
  FROM Test.dbo.contact
  WHERE FirstName LIKE 'A%'
  ORDER BY 1

  当这个运行时,我们看到了值“Adam”和“ADAM”。

在区分大小写的SQL Server数据库中使用DISTINCT的问题

  所以根据你的数据库是怎样建立的,你将能够或不能看到这个不同。

  为了给你显示另一个例子,下面是一个快速选择区分大小写或不区分大小写选项的方法。

  我们运行的第一个查询是使用区分大小写,所以四条记录都将显示出来。


  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

在区分大小写的SQL Server数据库中使用DISTINCT的问题

  第二个查询中不同的是收集的名称。当这个查询使用不区分大小写时,我们只获得两条记录。


  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') items



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值