天天看點

《Oracle SQL疑難解析》——1.14 排序

本節書摘來自異步社群出版社《oracle sql疑難解析》一書中的第1章,第1.14節,作者: 【美】grant allen , bob bryla , darl kuhn,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

oracle sql疑難解析

我們的文本資料混合了大寫、小寫字母和句子(英文句子,指第一個字母大寫,後續字母小寫)。我們希望把這些資料按字母順序、大小寫順序進行排列。

我們先在hr.employees表中建立一些混合大小寫的資料。運作下面的update語句,把william smith's的姓(last_name)改為大寫:

下面的select語句要求按oracle預設的排序方式顯示根據last_name排序的結果:

聰明的讀者可能已經猜到了排序結果。oracle預設用二進制的排序方法。在上面這個簡單的例子中,文本是按它們在代碼頁上對應數值的大小來排列的。編碼可以是us7ascii,weiiso8859p1或其他編碼方式。在這些代碼頁上,大、小寫字母有不同的值,大寫的值排在前面。這就是為什麼上面查詢結果中smith排在所有以“s”開頭的姓的最前面。

人們通常希望看見兩個“smith”排在一起,忽略大小寫。用這個nls環境變量可以達到目的:

oracle支援區分大小寫和不區分大小寫兩種排序方式。有個環境變量nls_sort進行區分大小寫和不區分大小寫的控制。預設的排序操作區分大小寫,即nls_sort=binary。如果我們希望排序按照不區分大小寫的方式,則需把環境變量nls_sort設定為binary_ci。

顧名思義,nls_sort僅僅影響排序結果,并不對其他大小寫操作構成影響。即使把nls_sort設定為binary_ci,以不區分大小寫的方式比較資料的操作仍然延續了oracle預設的方式:

對以上結果别灰心。oracle想到了你的需求,也提供了不區分大小寫的比較方式。

比較傳統的方式不是使用nls環境變量,而是用upper和lower函數把要比較的字段名、文字都轉成大寫或小寫後再比較。這種方法的不足之處在于,使用函數後,标準的索引就不能使用了,優化器無法工作,應對的方式是使用基于功能的索引(function-based index)。