Teilen über


Sortierung

Wichtig

Dieses Feature befindet sich in der Public Preview.

Gilt für:markiert mit Ja Databricks SQL markiert mit Ja Databricks Runtime 16.1 und höher

Eine Sortierung ist eine Reihe von Regeln, die bestimmt, wie Zeichenfolgenvergleiche ausgeführt werden. Sortierungen werden verwendet, um Zeichenfolgen ohne Beachtung von Groß-/Kleinschreibung, Akzenten oder nachstehenden Leerzeichen zu vergleichen oder um sie in einer bestimmten sprachspezifischen Reihenfolge zu sortieren.

Zeichenfolgen in Azure Databricks werden als Unicode-Zeichen mit UTF-8--Codierung dargestellt. Standardmäßig vergleicht Azure Databricks Zeichenfolgen anhand ihrer binären UTF8-Zusicherung. Dies wird als UTF8_BINARY-Sortierung bezeichnet. UTF8_BINARY-Vergleiche sind schnell und in vielen Fällen angemessen, aber möglicherweise nicht für alle Anwendungen geeignet, insbesondere dann nicht, wenn sprachspezifische Sortierungen oder Vergleiche erforderlich sind.

Neben sprachspezifischen Vergleichen ist ein weiterer gängiger Anwendungsfall die Nichtbeachtung der Groß-/Kleinschreibung. Azure Databricks bietet speziell für diesen Zweck die UTF8_LCASE-Sortierung. Es konvertiert Zeichenfolgen in Kleinbuchstaben, bevor sie mithilfe der schnellen UTF8_BINARY-Sortierung verglichen werden.

Für sprachspezifische Vergleiche verwendet Azure Databricks die folgenden Technologien:

Diese Technologien sind in einer Menge benannter Sortierungen gekapselt, die in SQL-Anweisungen verwendet werden können.

Sortierungsnamen

Da die Identifizierung von Sortierungen anhand ihrer LDML-Spezifikation komplex und schwierig zu lesen sein kann, verfügt Azure Databricks über eine Reihe von einfacher zu verwendenden benannten Systemsortierungen.

Syntax

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

locale
  language_code [ _ script_code ] [ _ country_code ]

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

    Eine metalokale binäre Sortierung, die Zeichenfolgen Byte für Byte basierend auf der UTF-8-Bytedarstellung vergleicht. UTF8_BINARY ist die Standardsortierung und die einfachste Sortierung für den Zeichenfolgenvergleich in Azure Databricks.

    In dieser Sortierung „A“ (x'65') < „B“ (x'66') < ... < „Z“ (x'90').

    Jedoch „Z“ (x'90') < „a“ (x'97') und „A“ (x'65') <> „a“ (x'97').

    Darüber hinaus sind Zeichen wie „Ä“ (x'C384') größer als „Z“ und „z“ in dieser Sortierung.

  • UTF8_LCASE

    Eine einfache, Sortierung (mit Meta-Gebietsschema) ohne Beachtung der Groß- und Kleinschreibung, die Zeichenketten anhand ihrer UTF-8-Byte-Darstellung vergleicht, nachdem sie in Kleinbuchstaben umgewandelt wurden.

    UTF8_LCASE ist die Sortierung, die für Bezeichner in Azure Databricks verwendet wird.

    Beispiel:

    ORDER BY col COLLATE UTF8_LCASE
    

    entspricht

    ORDER BY LOWER(col) COLLATE UTF8_BINARY
    
  • UNICODE

    Das ICU-Stammgebietsschema.

    Diese Sortierung, die in CLDR als „root“-Gebietsschema (LDML-Spezifikation: „und-u“) bezeichnet wird, verwendet eine sprachunabhängige Sortierreihenfolge, die insgesamt intuitiv sein soll. In dieser Sortierung werden ähnliche Zeichen gruppiert. Beispiel: „a“ < „A“ < „Ä“ < „b“. „A“ wird nicht als Äquivalent zu „a“ betrachtet. Daher wird bei der Sortierung die Groß-/Kleinschreibung beachtet. „a“ wird nicht als Äquivalent zu „ä“ betrachtet. Daher werden Akzente bei der Sortierung beachtet.

  • locale

    Eine lokalisierte Sortierung basierend auf den CLDR-Tabellen.

    Das Gebietsschema wird in Form eines Sprachcodes, eines optionalen Skriptcodes und eines optionalen Ländercodes angegeben. Für locale wird die Groß-/Kleinschreibung nicht beachtet.

    • language_code: Ein aus zwei Buchstaben bestehender ISO 639-1-Sprachcode.
    • script_code: Ein aus vier Buchstaben bestehender ISO 15924-Skriptcode.
    • country_code: Ein aus drei Buchstaben bestehender ISO 3166-1 alpha-3-Ländercode.
  • Modifizierer

    Gibt das Sortierungsverhalten in Bezug auf die Groß-/Kleinschreibung und Unterscheidung nach Akzent an.

    • CS: Groß-/Kleinschreibung wird beachtet. Das Standardverhalten.
    • CI: Groß-/Kleinschreibung wird nicht beachtet.
    • AS: Unterscheidung nach Akzent. Das Standardverhalten.
    • AI: Keine Unterscheidung nach Akzent.

    Gilt für: mit „Ja“ markiert Databricks Runtime 16.2 und höher

    • RTRIM: Keine Beachtung von nachstehenden Leerzeichen. Kürzt nachstehende Leerzeichen („u0020“) vor dem Vergleich.

    Gilt für:mit „Ja“ markiert Databricks Runtime 16.2 und höher

    Sie können RTRIM, entweder CS oder CI, und entweder AS oder AI höchstens einmal und in beliebiger Reihenfolge angeben. Bei den Modifizierern selbst wird die Groß-/Kleinschreibung nicht beachtet.

Bei der Verarbeitung von Sortierungen normalisiert Azure Databricks Sortierungsnamen, indem es Standardwerte entfernt. Beispielsweise wird SR_CYR_SRN_CS_AS auf SR normalisiert.

Eine Liste der unterstützten Sortierungen finden Sie unter Unterstützte Sortierungen.

Beispiele

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

Standardsortierung

Die Standardsortierung wird angewendet, wenn STRING-Literale, Parametermarkierungen, Funktionen ohne Zeichenfolgen, die STRING-Einstellungen produzieren verwendet werden, sowie bei der Definition von Spalten-, Feld- oder Variablentypen ohne eine COLLATE-Klausel.

Die Standardsortierung wird aus UTF8_BINARY abgeleitet.

Rangfolge von Sortierungen

Um zu entscheiden, welche Sortierung für eine bestimmte Zeichenfolge verwendet werden soll, definiert Azure Databricks Regeln für die Rangfolge von Sortierungen.

Die Regeln weisen 4 Rangstufen für Sortierungen zu:

  1. Explizit

    Die Sortierung wurde mit dem Ausdruck COLLATE explizit einer Zeichenfolge zugewiesen.

    Beispiele

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

    Die Sortierung wird implizit durch Spalte, Feld, Spaltenalias, Variable oder den Routineparameter zugewiesen. Dies schließt das Ergebnis einer Unterabfrage ein, solange die Sortierung nicht None ist.

    Beispiele

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

    Ein STRING-Literal, eine benannte oder unbenannte -Parametermarkierung oder eine STRING, die durch eine Funktion aus einem anderen Typ erzeugt wird.

    Beispiele

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

    Die zugewiesene Sortierung ist die Standardsortierung.

  4. Keine

    Ein STRING-Ergebnis einer Funktion, eines Operators oder eines Mengenvorgangs (z. B. UNION), die mehr als ein STRING-Argument akzeptiert, die unterschiedliche implizite Sortierungen aufweisen.

    Beispiele

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

Ableiten der Sortierung

Beim Ableiten der Sortierung für ein STRING-Ergebnis werden die Sortierungsrangfolgeregeln wie folgt angewendet:

Wenn der Ausdruck:

  1. den obigen Definitionen entspricht.

    Die Sortierung und Rangfolge sind wie festgelegt.

  2. ist eine Funktion oder ein Operator mit einem einzelnen STRING-Parameter, der eine STRING zurückgibt

    Die Sortierung und Rangfolge ist die des STRING-Parameters.

  3. ist eine Funktion oder ein Operator mit zwei oder mehr STRING Parametern

    1. mit denselben Sortierungen und Rangfolgen

      Die Sortierung und Rangfolge ist die der STRING Parameter.

    2. mit unterschiedlichen Sortierungen oder Rangfolgen

      Es gilt: C1 und C2 sind unterschiedliche Sortierungen und D ist die Standardsortierung. Die Rangfolge und die Sortierung werden durch die folgende Tabelle bestimmt:

      Sortierung und Rangfolge C1 Explicit C1 Implicit D Default Keine
      C2 Explicit Fehler C2 Explicit C2 Explicit C2 Explicit
      C2 Implicit Explicit C1 Keine C2 Implicit Keine
      D Default C1 Explicit C1 Implicit D Default Keine
      Keine C1 Explicit Keine Keine Keine

Beispiele

> SELECT 'hello' = 'hello   ' COLLATE UNICODE_RTRIM;
  true

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

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