共用方式為


編排序列

重要

這項功能 公開預覽版

適用於:標記為是的 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 採用下列技術:

這些技術會封裝在可用於 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:不敏感於口音。

    您可以指定 CSCI,以及 ASAI,且每個最多一次,並可依任意順序。 修飾詞本身不區分大小寫。

處理定序時,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 常值、參數標記、沒有 STRINGparameters 產生字元串的函式,以及定義 column不含 COLLATE 子句的欄位或變數類型時,會套用預設定序。

預設定序衍生於 UTF8_BINARY中。

定序優先順序

若要決定要用於指定字串的定序,Azure Databricks 會定義定序優先順序規則。

規則將 4 個優先等級指派給排序:

  1. 明確

    定序已使用 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
    
  2. 隱含

    定序是由 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', ',')
    
  3. 預設

    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()
    

    指派的排序規則是預設排序規則

  4. 函式、運算符或 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 結果的定序時,會以下列方式套用定序優先順序規則:

如果這個算式:

  1. 符合上述定義

    定序和優先順序如所定義。

  2. 是具有單一 STRING 參數的函式或運算符,會傳回 STRING

    定序和優先順序以 STRING 參數為準。

  3. 是具有兩個或多個 STRINGparameters 的函式或運算符

    1. 具有相同定序和優先順序

      排序和優先權是 STRINGparameters。

    2. 具有不同定序或優先順序

      C1C2 相異定序,讓 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