編排序列
重要
這項功能 公開預覽版。
適用於:標記為是的 Databricks Runtime 16.1 及更新版本
排序規則是決定如何執行字串比較的 set 規則。 定序可用來比較不區分大小寫或不區分腔調字的字串,或以特定語言感知順序排序字串。
Azure Databricks 中的字串是以 UTF-8 編碼的 Unicode 字元表示。
根據預設,Azure Databricks 會比較字串的二進位 UTF8 表示法。 這稱為 UTF8_BINARY
定序。
在許多情況下,UTF8_BINARY
比較既快速又適合,但可能不適合所有應用程式,尤其是需要語言感知排序或比較的應用程式。
除了語言特定比較之外,常見的使用案例是需要不區分大小寫的比較。
Azure Databricks 具有一個專門為此目的設計的 UTF8_LCASE
定序規則。
它會先將字串轉換成小寫,再使用快速 UTF8_BINARY
定序加以比較。
針對語言感知比較,Azure Databricks 採用下列技術:
- Unicode 國際元件 (ICU) 連結庫 計算定序
- 特定地區設定感知定序的通用地區設定資料存放庫 (CLDR)tables。
- Unicode 地區設定資料標記語言(LDML) 來內部編碼排序。
這些技術會封裝在可用於 SQL 語句的具名定序 set 中。
定序名稱
由於根據 LDML 規格識別定序可能很複雜且具有挑戰性,因此 Azure Databricks 提供了一種更易於使用的具名系統定序,稱為 set。
語法
{ UTF8_BINARY |
UTF8_LCASE |
{ UNICODE | locale } [ _ modifier [...] ] }
locale
language_code [ _ script_code ] [ _ country_code ]
modifier
{ CS | CI | AS | AI }
UTF8_BINARY
根據UTF-8位元組表示逐位比較字串位元組的元區域設定二進制定序。
UTF8_BINARY
是 Azure Databricks 中字串比較的預設和最輕量型定序。在這個排序中『A』(x'65') < 『B』(x'66') < … < 'Z' (x'90')。
然而,'Z' (x'90') < 'a' (x'97'), 和 'A' (x'65') <> 'a' (x'97')。
此外,此定序中的 'Ä' (x'C384' 等字元大於 'Z' 和 'z'。
UTF8_LCASE
輕量型中介區域設置不區分大小寫的定序機制,將字串轉換為小寫後,利用其 UTF-8 位元組表示來比較字串。
UTF8_LCASE
是用於 Azure Databricks 中 識別碼的排序。例如:
ORDER BY col COLLATE UTF8_LCASE
相當於
ORDER BY LOWER(col) COLLATE UTF8_BINARY
UNICODE
ICU 根區域設定。
此排序在 CLDR 中稱為「根」地區設定(LDML 規格:『und-u』),會施加一種不依賴語言的順序,而這種順序嘗試做到整體直觀。 在此定序中,字元和 字元會被分在一起。 例如:'a' < 'A' < 'Ä' < 'b'。 'A' 不被視為等於 'a'。 因此,定序會區分大小寫。 'a' 不視為等於 'ä'。 因此,定序會區分腔調。
地區設定
根據 CLDR tables的具地區感知的排序。
地區設定會指定為語言代碼、選用的腳本程序代碼,以及選擇性的國家/地區代碼。
locale
不區分大小寫。- language_code:兩個字母 ISO 639-1 語言代碼。
- script_code:四個字母的 ISO 15924 文字代碼。
- country_code:三個字母 ISO 3166-1 alpha-3 國家/地區代碼。
修飾詞
指定與區分大小寫及重音敏感度相關的定序行為。
- CS:區分大小寫。 默認行為。
- CI:不區分大小寫。
- AS:區分重音敏感性。 默認行為。
- AI:不敏感於口音。
您可以指定
CS
或CI
,以及AS
或AI
,且每個最多一次,並可依任意順序。 修飾詞本身不區分大小寫。
處理定序時,Azure Databricks 會藉由移除預設值來正規化定序名稱。
例如,SR_CYR_SRN_CS_AS
正規化為 SR
。
關於支援的定序 list,請參閱 支援的定序。
例子
-- You can fully qualify collations, and case doesn't matter.
system.builtin.unicode
-- Since all collations are system defined you don't need to qualify them
unicode
-- Using 2-letter language code only for german collation
DE
-- Using 2-letter language code and 3-letter country code for french-canadian collation
-- It is common to use lower case 2-letter language codes and upper case 3-letter country codes
-- But collation names are case insensitive
fr_CAN
-- Using 2-letter language code and 4-letter script code and 3-letter country code for traditional chinese in Macao
zh_Hant_MAC
-- Using a 2 letter german language code and 2 modifiers for case insensitive and accent insensitive
-- So 'Ä', 'A', and 'a' are all considered equal
de_CI_AI
-- Using back ticks is allowed, but unnecessary for builtin collations
`UTF8_BINARY`
預設排序方式
使用 STRING
常值、參數標記、沒有 STRING
parameters 產生字元串的函式,以及定義 column不含 COLLATE 子句的欄位或變數類型時,會套用預設定序。
預設定序衍生於 UTF8_BINARY
中。
定序優先順序
若要決定要用於指定字串的定序,Azure Databricks 會定義定序優先順序規則。
規則將 4 個優先等級指派給排序:
明確
定序已使用 COLLATE 運算式明確指派給字串。
範例
-- Force fast binary collation to check whether a vin matches a Ferrari vin COLLATE UTF8_BINARY LIKE 'ZFF%' -- Force German collation to order German first names ORDER BY vorname COLLATE DE
隱含
定序是由 column、欄位、column-alias、變數或 例程參數 參考所隱含指派。 這包含子查詢的結果,只要定序不是 None。
範例
-- Use the collation of the column as it was defined employee.name LIKE 'Mc%' -- Use the collation of the variable as it was defined. translate(session.tempvar, 'Z', ',')
預設
STRING
常值、具名或未命名的 參數標記,或由另一個型別的函式產生的STRING
。範例
-- A literal string has the default collation 'Hello' -- :parm1 is a parameter marker using session default collation EXECUTE IMMEDIATE 'SELECT :parm1' USING 'Hello' AS parm1; -- ? is a parameter marker using session default collation EXECUTE IMMEDIATE 'SELECT ?' USING 'Hello'; -- The result of a cast of a non-STRING to a STRING is a STRING with the default collation CAST(5 AS STRING) -- The date is converted to a string using the default collation to_char(DATE'2016-04-08', 'y') -- The collation of the session_user STRING is the default collation session_user()
無
函式、運算符或 set 運算(例如
UNION
)的STRING
結果,其採用多個具有不同 隱含 定序的STRING
自變數。範例
-- Concatenating two strings with different explicit collations results in no collation SELECT fr || de AS freutsch FROM VALUES('Voulez vous ' COLLATE FR), 'Kartoffelsupp...' COLLATE DE) AS T(fr, de) -- A union of two strings with different excplicit collations results in no collation SELECT 'Voulez vous ' COLLATE FR UNION ALL SELECT 'Kartoffelsupp...' COLLATE DE
定序衍生
衍生 STRING
結果的定序時,會以下列方式套用定序優先順序規則:
如果這個算式:
符合上述定義
定序和優先順序如所定義。
是具有單一
STRING
參數的函式或運算符,會傳回STRING
定序和優先順序以
STRING
參數為準。是具有兩個或多個
STRING
parameters 的函式或運算符具有相同定序和優先順序
排序和優先權是
STRING
parameters。具有不同定序或優先順序
讓
C1
和C2
相異定序,讓D
成為預設定序。 優先順序和定序是由下列 table決定:排序和優先順序 C1 明確 C1 隱含 D 預設值 沒有 C2 明確 錯誤 C2 明確 C2 明確 C2 明確 C2 隱含 明確 C1 沒有 C2 隱含 沒有 D 預設 C1 明確 C1 隱含 D 預設值 沒有 無 C1 明確 沒有 沒有 沒有
例子
> CREATE TABLE words(fr STRING COLLATE FR, de STRING COLLATE DE, en STRING COLLATE EN);
> INSERT INTO words VALUES ('Salut', 'Hallo', 'Hello');
-- A literal string has the default collation
> SELECT collation('Ciao');
UTF8_BINARY
-- A function producing a STRING has the default collation
> SELECT collation(user());
UTF8_BINARY
-- Function modifying a STRING passes the collation through
> SELECT collation(upper('Ciao'));
UTF8_BINARY
-- Implicit collation (French) wins over default collation
> SELECT collation(fr || 'Ciao') FROM words;
FR
-- Explicit collation (French) wins over implicit collation (German)
> SELECT collation('Salut' COLLATE FR || de) FROM words;
FR
-- Implicit collation German collides with implicit collation French
-- The result is no collation
> SELECT collation(de || fr) FROM words;
null
-- Explicit collation (French) wins over default collation (Italian)
> SELECT collation('Salut' COLLATE FR || 'Ciao');
FR
-- Explicit collation (French) collides with explicit collation (German)
> SELECT collation('Salut' COLLATE FR || 'Hallo' COLLATE DE);
COLLATION_MISMATCH.EXPLICIT
-- The explicit collation wins over no collation
> SELECT collation('Ciao' COLLATE IT || (fr || de)) FROM words;
UTF8_BINARY
-- The implict collation (English) does not win over None
> SELECT collation(en || (fr || de)) FROM words;
null
-- The explicit collation (English) wins over Implicit collation anywhere in the expression
> SELECT collation((fr || ltrim('H' COLLATE EN, fr)) || fr) FROM words;
EN