SQL Server數(shù)據(jù)庫(kù)中正確使用DISTINCT大小寫(xiě)
我們今天是要和大家一起討論的是SQL Server數(shù)據(jù)庫(kù)中正確使用DISTINCT的大小寫(xiě)問(wèn)題,在實(shí)際操作中SQL Server為你提供了在你的數(shù)據(jù)庫(kù)中存儲(chǔ)混合的大小寫(xiě)數(shù)據(jù)的實(shí)際操作能力,但是根據(jù)你怎樣創(chuàng)建數(shù)據(jù)庫(kù),SQL Server將在你給出T-SQL命令時(shí)忽視大小寫(xiě)。
你可能面對(duì)的一個(gè)問(wèn)題是你想從一個(gè)表獲得只包含不同值的列表,來(lái)顯示你的表中不
SQL Server為你提供了在你的數(shù)據(jù)庫(kù)中存儲(chǔ)混合大小寫(xiě)數(shù)據(jù)的能力,但是根據(jù)你怎樣創(chuàng)建數(shù)據(jù)庫(kù),SQL Server數(shù)據(jù)庫(kù)將在你給出T-SQL命令時(shí)忽視大小寫(xiě)。你可能面對(duì)的一個(gè)問(wèn)題是你想從一個(gè)表獲得只包含不同值的列表,來(lái)顯示你的表中不同,但是如果你的數(shù)據(jù)庫(kù)是按照不區(qū)分大小寫(xiě)來(lái)建立的,那么SQL Server數(shù)據(jù)庫(kù)中使用DISTINCT條件語(yǔ)句不會(huì)顯示這些不同,它只會(huì)將所有的值放在一起。所以在這方面有什么選擇嗎?
專(zhuān)家解答
為了說(shuō)明這個(gè)動(dòng)作,我們將使用一個(gè)區(qū)分大小寫(xiě)和一個(gè)不區(qū)分大小寫(xiě)的數(shù)據(jù)庫(kù)來(lái)看看它工作的兩種方式。
第一組查詢使用了AdventureWorks數(shù)據(jù)庫(kù),它被配置為區(qū)分大小寫(xiě)。為了得到從你的數(shù)據(jù)庫(kù)而來(lái)的集合,你可以運(yùn)行這個(gè)查詢:
- SELECT name, collation_name
- FROM master.sys.databases
我們將查詢AdventureWorks數(shù)據(jù)庫(kù)中的Preson.Contact的數(shù)據(jù)。所有的數(shù)據(jù)都是作為混合大小寫(xiě)來(lái)建立的,所以當(dāng)我們運(yùn)行這個(gè)查詢的時(shí)候我們沒(méi)有得到重復(fù)的值。
- SELECT DISTINCT TOP 10 FirstName
- FROM Person.Contact
- WHERE FirstName LIKE 'A%'
- ORDER BY 1
如果你更新一條記錄并將FirstName從“Adam”改為“ADAM”,那么當(dāng)運(yùn)行這個(gè)查詢時(shí)我們會(huì)獲得兩個(gè)不同的值。
- 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
正如你看到的,現(xiàn)在“Adam”和“ADAM”作為不同的值來(lái)顯示。
下一步我們將要做的是在一個(gè)不區(qū)分大小寫(xiě)的數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)新表然后從Person.Contact加載所有的數(shù)據(jù)到這個(gè)新表中。
- 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
當(dāng)我們運(yùn)行SELECT查詢時(shí)你可以看到輸出將“Adam”和“ADAM”結(jié)合起來(lái),因?yàn)椴粎^(qū)分大小寫(xiě)。
為了解決這個(gè)問(wèn)題我們可以將這個(gè)查詢按照下面的方式修改使得這個(gè)收集在FirstName字段上區(qū)分大小寫(xiě)。
- SELECT DISTINCT TOP 10 FirstName COLLATE sql_latin1_general_cp1_cs_as
- FROM Test.dbo.contact
- WHERE FirstName LIKE 'A%'
- ORDER BY 1
當(dāng)這個(gè)運(yùn)行時(shí),我們看到了值“Adam”和“ADAM”。
所以根據(jù)你的數(shù)據(jù)庫(kù)是怎樣建立的,你將能夠或不能看到這個(gè)不同。
為了給你顯示另一個(gè)例子,下面是一個(gè)快速選擇區(qū)分大小寫(xiě)或不區(qū)分大小寫(xiě)選項(xiàng)的方法。
我們運(yùn)行的第一個(gè)查詢是SQL Server數(shù)據(jù)庫(kù)中使用區(qū)分大小寫(xiě),所以四條記錄都將顯示出來(lái)。
- 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
第二個(gè)查詢中不同的是收集的名稱(chēng)。當(dāng)這個(gè)查詢使用不區(qū)分大小寫(xiě)時(shí),我們只獲得兩條記錄。
- 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
以上的相關(guān)內(nèi)容就是對(duì)SQL Server數(shù)據(jù)庫(kù)中使用DISTINCT的大小寫(xiě)問(wèn)題的介紹,望你能有所收獲。