Sortierung
Wichtig
Dieses Feature befindet sich in der Public Preview.
Gilt für: Databricks SQL
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:
- International Components for Unicode (ICU)-Bibliothek zur Berechnung der Sortierung
- Common Locale Data Repository (CLDR)-Tabellen für Sortierungen für spezifische Gebietsschemata.
- Unicode Locale Data Markup Language (LDML), um Kollationen intern zu codieren.
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:
Databricks Runtime 16.2 und höher
- RTRIM: Keine Beachtung von nachstehenden Leerzeichen. Kürzt nachstehende Leerzeichen („u0020“) vor dem Vergleich.
Gilt für:
Databricks Runtime 16.2 und höher
Sie können
RTRIM
, entwederCS
oderCI
, und entwederAS
oderAI
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:
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
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', ',')
Standard
Ein
STRING
-Literal, eine benannte oder unbenannte -Parametermarkierung oder eineSTRING
, 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.
Keine
Ein
STRING
-Ergebnis einer Funktion, eines Operators oder eines Mengenvorgangs (z. B.UNION
), die mehr als einSTRING
-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:
den obigen Definitionen entspricht.
Die Sortierung und Rangfolge sind wie festgelegt.
ist eine Funktion oder ein Operator mit einem einzelnen
STRING
-Parameter, der eineSTRING
zurückgibtDie Sortierung und Rangfolge ist die des
STRING
-Parameters.ist eine Funktion oder ein Operator mit zwei oder mehr
STRING
Parameternmit denselben Sortierungen und Rangfolgen
Die Sortierung und Rangfolge ist die der
STRING
Parameter.mit unterschiedlichen Sortierungen oder Rangfolgen
Es gilt:
C1
undC2
sind unterschiedliche Sortierungen undD
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