Syntax
用途:
NLSSORT返回字符值char的排序規則鍵和顯式或隱式指定的排序規則。排序規則鍵是一個用於根據指定的排序規則對char進行排序的字節字符串。排序規則鍵的屬性是:按二進制比較由給定的排序規則生成的兩個排序鍵的相互排序和按給定的排序規則比較源字符值的相互排序相同。
char和 'nlsparam' 可以是char、varchar2、nchar或NVARCHAR2中的任何類型。
'nlsparam' 的值必須具有形式 'NLS_SORT = collation'
其中collation是語言排序規則或BINARY。NLSSORT使用指定的排序規則生成排序規則鍵。如果省略'nlsparam',則此函數使用參數char的派生排序規則。如果指定BINARY,則此函數將char值本身轉換為raw返回,並可能按下面的說明截斷。
如果指定'nlsparam',則可以將后綴“_ai”附加到語言排序規則名稱中,以請求不區分重音的排序規則,或者“_ci”請求不區分大小寫的排序規則。有關重音和不區分大小寫排序的詳細信息,請參閱《 Oracle Database Globalization Support Guide》。不建議對 ORDER BY 查詢子句使用不區分重音或不區分大小寫的排序規則,因為它會導致不確定的排序順序。
返回的排序鍵是 RAW 類型。給定排序規則對給定char值產生的排序規則鍵的長度可能超過NLSSORT返回的 RAW 的最大長度。在這種情況下,NLSSORT的行為取決於初始化參數 MAX_STRING_SIZE的值。如果 MAX_STRING_SIZE = EXTENDED,則返回值的最大長度為32767字節。如果排序規則鍵超出此限制,則函數將失敗,並出現錯誤“ORA-12742:無法創建排序規則鍵”。如果短輸入字符串包含的Unicode字符百分比很高且分解率很高,則也可能會報告此錯誤。
如果 MAX_STRING_SIZE = STANDARD,則返回值的最大長度為2000字節。如果返回值超出限度,那么NLSSORT將計算char的最大前綴或初始子字符串的排序規則鍵,以便計算結果不超過最大長度。對於單語排序,例如FRENCH,前綴長度通常為1000個字符。對於多語言排序,例如GENERIC_M,前綴通常為500個字符。對於Unicode Collation Algorithm (UCA)排序,例如UCA0610_DUCET,前綴通常為285個字符。根據排序規則和char中包含的字符,准確的長度可能會更低或更高。
當 MAX_STRING_SIZE = STANDARD時的行為意味着,如果兩個字符值的排序鍵(NLSSORT結果)在前綴上沒有差異,即使它們在某些進一步的字符位置上可能有所不同,則將其比較以發現語言順序是相等的。由於隱式使用NLSSORT函數查找比較條件、between條件、in條件、order by、group by和count(distinct)的語言順序,因此這些操作可能返回僅對長字符值近似的結果。如果您希望確保這些操作的結果是准確的,那么遷移數據庫以使用MAX_STRING_SIZE = EXTENDED。
此函數不直接支持CLOB數據。但是,CLOB可以通過隱式數據轉換作為參數傳入。
實例
此函數可用於指定基於語言排序序列的排序和比較操作,而不是基於字符串的二進制值。下面的示例創建一個包含兩個值的測試表,並顯示如何通過nlsort函數對返回的值進行排序:
CREATE TABLE test (name VARCHAR2(15)); INSERT INTO test VALUES ('Gaardiner'); INSERT INTO test VALUES ('Gaberd'); INSERT INTO test VALUES ('Gaasten'); SELECT * FROM test ORDER BY name; NAME --------------- Gaardiner Gaasten Gaberd SELECT * FROM test ORDER BY NLSSORT(name, 'NLS_SORT = XDanish'); NAME --------------- Gaberd Gaardiner Gaasten
下面的示例說明如何在比較操作中使用NLSSORT函數:
SELECT * FROM test WHERE name > 'Gaberd' ORDER BY name; no rows selected SELECT * FROM test WHERE NLSSORT(name, 'NLS_SORT = XDanish') > NLSSORT('Gaberd', 'NLS_SORT = XDanish') ORDER BY name; NAME --------------- Gaardiner Gaasten
如果在使用相同語言排序序列的比較操作中經常使用NLSSORT,那么考慮使用這種更有效的替代方法:將 NLS_COMP 參數(對於數據庫或當前會話)設置為LINGUISTIC,並將會話的NLS_SORT參數設置為所需的排序序列。在當前會話期間,Oracle數據庫將默認使用該排序順序進行所有排序和比較操作:
ALTER SESSION SET NLS_COMP = 'LINGUISTIC'; ALTER SESSION SET NLS_SORT = 'XDanish'; SELECT * FROM test WHERE name > 'Gaberd' ORDER BY name; NAME --------------- Gaardiner Gaasten