Ordenação
Importante
Esse recurso está em Visualização Pública.
Aplica-se a: Databricks SQL
Databricks Runtime 16.1 e versões posteriores
Uma ordenação é um conjunto de regras que determina como comparações de cadeias de caracteres são executadas. As ordenações são usadas para comparar cadeias de caracteres de maneira que não diferencia letras maiúsculas de minúsculas, acentos ou espaços à direita, ou para classificar cadeias de caracteres em uma ordem específica sensível ao idioma.
Cadeias de caracteres no Azure Databricks são representadas como caracteres Unicode codificadas em UTF-8.
Por padrão, o Azure Databricks compara cadeias de caracteres por sua representação UTF8 binária. Isso é conhecido como ordenação UTF8_BINARY
.
Comparações UTF8_BINARY
são rápidas e apropriadas em muitos casos, mas podem não ser adequadas para todas as aplicações, especialmente aquelas que exigem classificação ou comparações com reconhecimento de linguagem.
Além das comparações com detecção de idioma, um caso de uso comum é impor a diferenciação de maiúsculas e minúsculas.
O Azure Databricks tem a classificação UTF8_LCASE
especificamente para esse propósito.
Isso converte cadeias de caracteres em letras minúsculas antes de compará-las usando a ordenação rápida UTF8_BINARY
.
Para comparações com reconhecimento vocal, o Azure Databricks emprega as seguintes tecnologias:
- Biblioteca International Components for Unicode (ICU) para computar a ordenação
- Tabelas do CLDR (Common Locale Data Repository) para ordenação específica com reconhecimento de localidade.
- LDML (Linguagem de Marcação de Dados de Localidade) Unicode para codificar ordenações internamente.
Essas tecnologias são encapsuladas em um conjunto de ordenações nomeadas que podem ser usadas em instruções SQL.
Nomes de ordenações
Como identificar ordenações por sua especificação LDML pode ser complexo e desafiador de ler, o Azure Databricks tem um conjunto de ordenações de sistema nomeadas mais fáceis de usar.
Sintaxe
{ UTF8_BINARY |
UTF8_LCASE |
{ UNICODE | locale } [ _ modifier [...] ] }
locale
language_code [ _ script_code ] [ _ country_code ]
modifier
{ CS | CI | AS | AI | RTRIM }
UTF8_BINARY
Uma ordenação primária de metalocalidade que compara cadeias de caracteres byte a byte com base na representação de bytes UTF-8.
UTF8_BINARY
é a ordenação padrão e mais leve para comparação de cadeias de caracteres no Azure Databricks.Nesta ordenação, ‘A’ (x’65’) < ‘B’ (x’66’) < … < ‘Z’ (x’90’).
No entanto, ‘Z’ (x’90’) < ‘a’ (x’97’) e ‘A’ (x’65’) <> ‘a’ (x’97’).
Além disso, caracteres como 'Ä' (x'C384') são maiores que 'Z' e 'z' nessa ordenação.
UTF8_LCASE
Uma ordenação leve, com metalocalização, que não diferencia maiúsculas de minúsculas e compara cadeias de caracteres usando sua representação de bytes UTF-8, após convertê-las em letras minúsculas.
A ordenação
UTF8_LCASE
é usada para identificadores no Azure Databricks.Por exemplo:
ORDER BY col COLLATE UTF8_LCASE
é equivalente a
ORDER BY LOWER(col) COLLATE UTF8_BINARY
UNICODE
A localidade raiz do ICU.
Essa ordenação, conhecida em CLDR como a localidade 'raiz' (especificação LDML: 'und-u') impõe uma ordem independente de linguagem, que tenta ser intuitiva no geral. Nesta ordenação, caracteres semelhantes são agrupados. Por exemplo: 'a' < 'A' < 'Ä' < 'b'. 'A' não é considerado equivalente a 'a'. Portanto, a ordenação diferencia maiúsculas de minúsculas. 'a' não é considerado equivalente a 'ä'. Portanto, a ordenação diferencia acentos.
locale
Uma ordenação com reconhecimento de localidade com base nas tabelas CLDR.
A localidade é especificada como um código de idioma, um código de script opcional e um código de país opcional.
locale
não diferencia maiúsculas de minúsculas.- language_code: um código de idioma ISO 639-1 de duas letras.
- script_code: um código de script ISO 15924 de quatro letras.
- country_code: um código do país ISO 3166-1 alpha-3 de três letras.
modifier
Especifica o comportamento de ordenação em relação à diferenciação de maiúsculas e minúsculas e à diferenciação de acentos.
- CS: diferencia maiúsculas de minúsculas. O comportamento padrão.
- CI: não diferencia maiúsculas de minúsculas.
- AS: diferencia acentos. O comportamento padrão.
- IA: não diferencia acentos.
Aplica-se a:
Databricks Runtime 16.2 e posterior
- RTRIM: não diferencia espaços em branco no final. Remove os espaços no final ('u0020') antes da comparação.
Aplica-se a:
Databricks Runtime 16.2 e posteriores
Você pode especificar
RTRIM
,CS
ouCI
, eAS
ouAI
no máximo uma vez e em qualquer ordem. Os modificadores em si não diferenciam maiúsculas de minúsculas.
Ao processar uma ordenação, o Azure Databricks normaliza os nomes de ordenação removendo os valores padrão.
Por exemplo, SR_CYR_SRN_CS_AS
é normalizado para SR
.
Para obter uma lista de ordenações com suporte, confira Ordenações com suporte.
Exemplos
-- 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`
Ordenação padrão
A ordenação padrão se aplica ao usar literais STRING
, marcadores de parâmetro, funções sem parâmetros STRING
que produzem cadeias de caracteres e ao definir tipos de coluna, campo ou variável sem uma cláusula COLLATE.
A ordenação padrão é derivada em UTF8_BINARY
.
Precedência da ordenação
Para decidir qual ordenação usar para uma determinada cadeia de caracteres, o Azure Databricks define as regras de precedência de ordenação.
As regras atribuem 4 níveis de precedência às ordenações:
Explícito
A ordenação foi atribuída explicitamente a uma cadeia de caracteres usando a expressão COLLATE.
Exemplos
-- 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
Implícito
A ordenação é atribuída implicitamente pela referência de coluna, campo, alias de coluna, variável ou parâmetro de rotina. Isso inclui o resultado de uma subconsulta, desde que a ordenação não seja None.
Exemplos
-- 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', ',')
Padrão
Um literal
STRING
, um marcador de parâmetro nomeado ou não nomeado ou umSTRING
produzido por uma função de outro tipo.Exemplos
-- 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()
A ordenação atribuída é a Ordenação padrão.
Nenhuma
Um resultado
STRING
de uma função, operador ou operação de conjunto (por exemplo,UNION
) que usa mais de um argumentoSTRING
que têm ordenações implícitas diferentes.Exemplos
-- 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
Derivação de ordenação
Ao derivar a ordenação de um resultado STRING
, as regras de precedência de ordenação são aplicadas das seguintes maneiras:
Se a expressão:
corresponde às definições acima
A ordenação e a precedência serão conforme definidas.
é uma função ou operador com um único parâmetro
STRING
, retornando umSTRING
A ordenação e a precedência são as do parâmetro
STRING
.é uma função ou operador com dois ou mais parâmetros de
STRING
com as mesmas ordenações e precedências
A ordenação e a precedência são as mesmas dos parâmetros
STRING
.com ordenações ou precedência diferentes
Deixe
C1
eC2
serem ordenações distintas e deixeD
ser a ordenação padrão. A precedência e a ordenação são determinadas pela tabela a seguir:Ordenação e precedência C1 explícito C1 Implícito D padrão Nenhum C2 explícito Erro C2 explícito C2 explícito C2 explícito C2 implícito C1 explícito Nenhum C2 Implícito Nenhum D padrão C1 explícito C1 Implícito D padrão Nenhum Nenhuma C1 explícito Nenhum Nenhum Nenhum
Exemplos
> 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