Dela via


Sortering

Viktig

Den här funktionen finns i offentlig förhandsversion.

gäller för:markerad med ja Databricks Runtime 16.1 och senare

En sortering är en uppsättning regler som avgör hur strängjämförelser utförs. Kollationeringar används för att jämföra strängar på ett sätt som är okänsligt för skiftläge eller accent, eller för att sortera strängar i en specifik språkanpassad ordning.

Strängar i Azure Databricks representeras som UTF-8 kodade Unicode-tecken. Som standard jämför Azure Databricks strängar med deras binära UTF8-representation. Detta kallas UTF8_BINARY sortering. UTF8_BINARY jämförelser är snabba och lämpliga i många fall, men kanske inte är lämpliga för alla program, särskilt de som kräver språkmedveten sortering eller jämförelser.

Förutom språkmedvetna jämförelser är ett vanligt användningsfall att kräva skiftlägesinsensitiva jämförelser. Azure Databricks har specifikt UTF8_LCASE-sorteringen för detta ändamål. Den konverterar strängar till gemener innan de jämförs genom snabb UTF8_BINARY-teckenkollationering.

För språkmedvetna jämförelser använder Azure Databricks följande tekniker:

Dessa tekniker kapslas in i en uppsättning namngivna sorteringar som kan användas i SQL-instruktioner.

Collationnamn

Eftersom det kan vara svårt att identifiera sorteringar utifrån deras LDML-specifikationer, har Azure Databricks en uppsättning mer lättanvända namngivna systemsorteringar.

Syntax

{ UTF8_BINARY |
  UTF8_LCASE |
  { UNICODE | locale } [ _ modifier [...] ] }

locale
  language_code [ _ script_code ] [ _ country_code ]

modifier
  { CS | CI | AS | AI }
  • UTF8_BINARY

    En binär sortering med meta-nationella inställningar som jämför strängar byte med byte baserat på UTF-8 byte-representationen. UTF8_BINARY är standardsorteringen och den enklaste sorteringen för strängjämförelse i Azure Databricks.

    I den här sorteringen "A" (x'65') < "B" (x'66') < ... < "Z" (x'90').

    Men 'Z' (x'90') < 'a' (x'97') och 'A' (x'65') <> 'a' (x'97').

    Dessutom är tecken som "Ä" (x'C384') större än "Z" och "z" i den här sorteringen.

  • UTF8_LCASE

    En lättvikts meta-locale skiftlägesokänslig sortering som jämför strängar utifrån deras UTF-8 byte-representation efter konvertering av strängarna till gemener.

    UTF8_LCASE är sorteringen som används för identifierare i Azure Databricks.

    Till exempel:

    ORDER BY col COLLATE UTF8_LCASE
    

    motsvarar

    ORDER BY LOWER(col) COLLATE UTF8_BINARY
    
  • UNICODE

    ICU-rotspråket.

    Denna sortering, som i CLDR kallas "rotspråket" (LDML-specifikation: "und-u"), inför en språkagnostisk ordning som försöker vara intuitiv totalt sett. I en sådan sortering grupperas tecken som med tecken som. Till exempel: "a" < "A" < "Ä" < "b". "A" anses inte motsvara "a". Sorteringen är därför skiftlägeskänslig. "a" anses inte motsvara "ä". Sorteringen är därför accentkänslig.

  • nationella inställningar

    En språkmedveten sortering baserat på CLDR-tabellerna.

    Språkvarianten anges som en språkkod, en valfri skriptkod och en valfri landskod. locale är skiftlägesokänsligt.

    • language_code: En iso 639-1 språkkod med två bokstäver.
    • script_code: En ISO 15924 skriptkod med fyra bokstäver.
    • country_code: En tre-bokstavs ISO 3166-1 alfa-3 landskoden.
  • modifier

    Anger sorteringsbeteendet för skiftlägeskänslighet och accentkänslighet.

    • CS-: Skiftlägeskänslig. Standardbeteende.
    • CI-: Skiftlägesokänslig.
    • AS:: Accentkänslig. Det förvalda beteendet.
    • AI: Accentsokänslig.

    Du kan ange antingen CS eller CIoch antingen AS eller AI högst en gång och i valfri ordning. Själva modifierarna är skiftlägesokänsliga.

När du bearbetar en sortering normaliserar Azure Databricks sorteringsnamn genom att ta bort standardvärden. Till exempel normaliseras SR_CYR_SRN_CS_AS till SR.

För en lista över sorteringar som stöds, se sorteringar som stöds.

Exempel

-- 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`

Standardsammanställning

Standardsortering gäller när du använder STRING literaler, parametermarkörer, funktioner utan STRING parametrar som producerar strängar och när du definierar kolumn-, fält- eller variabeltyper utan EN COLLATE-sats.

Standardsortering härleds från UTF8_BINARY.

Sorteringsprioritet

För att bestämma vilken sortering som ska användas för en viss sträng definierar Azure Databricks regler för sorteringsprioritet.

Reglerna tilldelar 4 prioritetsnivåer till sorteringar:

  1. uttrycklig

    Sorteringen har uttryckligen tilldelats en sträng med hjälp av COLLATE-uttryck.

    Exempel

    -- 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. implicit

    Sorteringen tilldelas implicit av kolumnen , fältet , kolumnaliaset , variabeln eller rutinparameterreferensen . Detta inkluderar resultatet av en underfråga så länge sorteringen inte är Ingen.

    Exempel

    -- 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. standard

    En STRING-literal, namngiven eller namnlös -parametermarkör, eller en STRING som genereras av en funktion av en annan typ.

    Exempel

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

    Den tilldelade sorteringen är Standardsortering.

  4. Ingen

    Ett STRING resultat av en funktion, operator eller set-operation (t.ex. UNION) som tar mer än ett STRING argument som har olika implicita kollationer.

    Exempel

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

Sorteringshärledning

När sorteringsordningen för ett STRING-resultat härleds tillämpas företrädesreglerna på följande sätt:

Om uttrycket:

  1. matchar definitionerna ovan

    Sorteringen och prioriteten är som definierat.

  2. är en funktion eller operator med en enda STRING parameter som returnerar en STRING

    Sorteringsordning och prioritetsordning är för parametern STRING.

  3. är en funktion eller operator med två eller flera STRING parametrar

    1. med samma sortering och prioritet

      Sortering och prioritet är de STRING parametrarnas.

    2. med olika sortering eller prioritet

      Låt C1 och C2 vara distinkta sorteringar och låt D vara standardsortering. Prioriteten och sorteringen bestäms av följande tabell:

      Sortering och prioritet C1 Explicit C1 Implicit D Förval Ingen
      C2 Explicit Fel C2 Explicit C2 Explicit C2 Explicit
      C2 Implicit Explicit C1 Ingen C2 Implicit Ingen
      D Standard C1 Explicit C1 Implicit D Förval Ingen
      Ingen C1 Explicit Ingen Ingen Ingen

Exempel

> 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