Spec-Zone.ru › DuckDB

Сортировки

Сортировки предоставляют правила для того, как текст должен быть отсортирован или сравнен в движке выполнения. Сортировки полезны для локализации, поскольку правила упорядочения текста различны для разных языков или стран. Эти порядки часто несовместимы друг с другом. Например, в английском языке буква y стоит между x и z. Однако, в литовском языке буква y стоит между i и j. По этой причине поддерживаются различные сортировки. Пользователь должен выбрать сортировку, которую он хочет использовать при выполнении операций сортировки и сравнения.

По умолчанию используется сортировка BINARY. Это означает, что строки упорядочиваются и сравниваются только на основе их двоичного содержимого. Это имеет смысл для стандартных символов ASCII (т.е., букв A-Z и цифр 0-9), но, как правило, не имеет большого смысла для специальных символов Unicode. Тем не менее, это на много быстрее, чем другие методы упорядочения и сравнения. Поэтому рекомендуется использовать сортировку BINARY, если не требуется иное.

Предупреждение Поддержка сортировок в DuckDB имеет некоторые известные ограничения и имеет несколько запланированных улучшений.

Использование сортировок

В автономной установке DuckDB включены три сортировки: NOCASE, NOACCENT и NFC. Сортировка NOCASE сравнивает символы как равные независимо от их регистра. Сортировка NOACCENT сравнивает символы как равные независимо от их акцентов. Сортировка NFC выполняет сравнения с нормализацией NFC, см. нормализацию Unicode для получения дополнительной информации.

SELECT 'hello' = 'hElLO';
false
SELECT 'hello' COLLATE NOCASE = 'hElLO';
true
SELECT 'hello' = 'hëllo';
false
SELECT 'hello' COLLATE NOACCENT = 'hëllo';
true

Сортировки можно комбинировать, объединяя их с помощью оператора точки. Однако не все сортировки можно комбинировать. В целом, сортировку NOCASE можно комбинировать с любой другой сортировкой, но большинство других сортировок комбинировать нельзя.

SELECT 'hello' COLLATE NOCASE = 'hElLÖ';
false
SELECT 'hello' COLLATE NOACCENT = 'hElLÖ';
false
SELECT 'hello' COLLATE NOCASE.NOACCENT = 'hElLÖ';
true

Сортировки по умолчанию

Все рассмотренные до сих пор сортировки были указаны для каждого выражения. Также можно указать сортировку по умолчанию на глобальном уровне базы данных или в столбце таблицы. Для указания глобальной сортировки по умолчанию используется PRAGMA default_collation. Это сортировка, которая будет использоваться, если не указана другая.

SET default_collation = NOCASE;
SELECT 'hello' = 'HeLlo';
true

Сортировки также можно указывать для каждого столбца при создании таблицы. При последующем использовании этого столбца в сравнении используется сортировка, указанная для этого столбца.

CREATE TABLE names (name VARCHAR COLLATE NOACCENT);
INSERT INTO names VALUES ('hännes');
SELECT name
FROM names
WHERE name = 'hannes';
hännes

Однако, следует быть осторожным, так как разные сортировки нельзя комбинировать. Это может быть проблематично, когда вы хотите сравнивать столбцы, для которых указана разная сортировка.

SELECT name
FROM names
WHERE name = 'hannes' COLLATE NOCASE;
ERROR: Cannot combine types with different collation!
CREATE TABLE other_names (name VARCHAR COLLATE NOCASE);
INSERT INTO other_names VALUES ('HÄNNES');
SELECT names.name AS name, other_names.name AS other_name
FROM names, other_names
WHERE names.name = other_names.name;
ERROR: Cannot combine types with different collation!

В этом случае необходимо вручную переопределить сортировку:

SELECT names.name AS name, other_names.name AS other_name
FROM names, other_names
WHERE names.name COLLATE NOACCENT.NOCASE = other_names.name COLLATE NOACCENT.NOCASE;
name other_name
hännes HÄNNES

Сортировки ICU

Рассмотренные ранее сортировки не зависят от региона и не следуют никаким определённым региональным правилам. Если необходимо следовать правилам определённого региона или языка, потребуется использовать одну из сортировок ICU. Для этого необходимо загрузить расширение ICU.

Если вы используете C++ API, вы можете найти расширение в папке extension/icu проекта DuckDB. Используя C++ API, расширение можно загрузить следующим образом:

DuckDB db;
db.LoadExtension<ICUExtension>();

Загрузка этого расширения добавит в вашу базу данных ряд сортировок, специфичных для языка и региона. Эти сортировки можно запросить с помощью команды PRAGMA collations или запросив функцию pragma_collations.

PRAGMA collations;
SELECT * FROM pragma_collations();
[af, am, ar, as, az, be, bg, bn, bo, bs, bs, ca, ceb, chr, cs, cy, da, de, de_AT, dsb, dz, ee, el, en, en_US, en_US, eo, es, et, fa, fa_AF, fi, fil, fo, fr, fr_CA, ga, gl, gu, ha, haw, he, he_IL, hi, hr, hsb, hu, hy, id, id_ID, ig, is, it, ja, ka, kk, kl, km, kn, ko, kok, ku, ky, lb, lkt, ln, lo, lt, lv, mk, ml, mn, mr, ms, mt, my, nb, nb_NO, ne, nl, nn, om, or, pa, pa, pa_IN, pl, ps, pt, ro, ru, se, si, sk, sl, smn, sq, sr, sr, sr_BA, sr_ME, sr_RS, sr, sr_BA, sr_RS, sv, sw, ta, te, th, tk, to, tr, ug, uk, ur, uz, vi, wae, wo, xh, yi, yo, zh, zh, zh_CN, zh_SG, zh, zh_HK, zh_MO, zh_TW, zu]

Эти сортировки можно использовать так же, как и другие сортировки. Они также могут быть объединены с сортировкой NOCASE. Например, для использования правил сортировки для немецкого языка можно использовать следующий фрагмент кода:

CREATE TABLE strings (s VARCHAR COLLATE DE);
INSERT INTO strings VALUES ('Gabel'), ('Göbel'), ('Goethe'), ('Goldmann'), ('Göthe'), ('Götz');
SELECT * FROM strings ORDER BY s;
"Gabel", "Göbel", "Goethe", "Goldmann", "Göthe", "Götz"

© Copyright 2018–2024 Stichting DuckDB Foundation
Licensed under the MIT License.
https://duckdb.org/docs/sql/expressions/collations.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API