Spec-Zone.ru › DuckDB

Приведение типов

Приведение типов — это операция преобразования значения одного типа данных в соответствующее значение другого типа. Как и другие СУБД, DuckDB поддерживает неявное и явное приведение типов.

Явное приведение

Явное приведение типов выполняется с помощью выражения CAST. Например, CAST(col AS VARCHAR) или col::VARCHAR явно приводят столбец col к типу VARCHAR. Дополнительную информацию см. на странице преобразования.

Неявное приведение

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

Рассмотрим функцию sin(DOUBLE). Эта функция принимает в качестве входного аргумента столбец типа DOUBLE, однако ее можно вызвать и с целым числом: sin(1). Целое число преобразуется в двойное число перед передачей в функцию sin.

Неявные преобразования могут быть добавлены только для определенных комбинаций типов и, как правило, возможны только тогда, когда преобразование не может привести к ошибке. Например, неявное преобразование может быть добавлено от INTEGER к DOUBLE — но не от DOUBLE к INTEGER.

Матрица операций преобразования

Значения определенного типа данных не всегда могут быть преобразованы в произвольный целевой тип данных. Исключением является значение NULL — которое всегда можно преобразовать между типами. Следующая матрица описывает поддерживаемые преобразования. Если разрешено неявное преобразование, это подразумевает, что возможно и явное преобразование.

Typecasting matrix

Даже если операция преобразования поддерживается исходя из исходного и целевого типов данных, это не обязательно означает, что операция преобразования будет успешной во время выполнения.

Устаревшее До версии 0.10.0 DuckDB позволяла неявно преобразовывать любой тип в VARCHAR во время связывания функций. Версия 0.10.0 внесла изменение, которое больше не допускает неявное преобразование в VARCHAR. Опцию old_implicit_casting можно использовать для возвращения к старому поведению. Однако обратите внимание, что этот флаг в будущем будет устаревшим.

Потери точности при преобразовании

Разрешены операции преобразования, приводящие к потере точности. Например, можно явно преобразовать числовой тип с дробными знаками, например DECIMAL, FLOAT или DOUBLE в целочисленный тип, например INTEGER. Число будет округлено.

SELECT CAST(3.5 AS INTEGER);

Переполнение

Операции преобразования, которые могут привести к переполнению значения, вызывают ошибку. Например, значение 999 слишком велико, чтобы быть представлено типом данных TINYINT. Поэтому попытка преобразовать это значение в этот тип приводит к ошибке во время выполнения:

SELECT CAST(999 AS TINYINT);
Conversion Error: Type INT32 with value 999 can't be cast because the value is out of range for the destination type INT8

Таким образом, хотя операция преобразования от INTEGER к TINYINT поддерживается, для этого конкретного значения она невозможна. TRY_CAST можно использовать для преобразования значения в NULL вместо выдачи ошибки.

Varchar

Тип VARCHAR является универсальной целью: любое произвольное значение любого произвольного типа всегда можно преобразовать в тип VARCHAR. Этот тип также используется для отображения значений в оболочке.

SELECT CAST(42.5 AS VARCHAR);

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

SELECT CAST('NotANumber' AS INTEGER);

В целом, преобразование в VARCHAR является безошибочным преобразованием, и любой тип можно преобразовать обратно в исходный тип после преобразования в текст.

SELECT CAST(CAST([1, 2, 3] AS VARCHAR) AS INTEGER[]);

Типы литералов

Целочисленные литералы (например, 42) и строковые литералы (например, 'string') имеют особые правила неявного преобразования. Дополнительную информацию см. на странице типов литералов.

Списки/Массивы

Списки можно явно преобразовывать в другие списки, используя те же правила преобразования. Преобразование применяется к элементам списка. Например, если мы преобразуем список INTEGER[] в список VARCHAR[], элементы INTEGER списка индивидуально преобразуются в VARCHAR, и создается новый список.

SELECT CAST([1, 2, 3] AS VARCHAR[]);

Массивы

Массивы подчиняются тем же правилам преобразования, что и списки. Кроме того, массивы могут быть неявно преобразованы в списки одного типа. Например, массив INTEGER[3] может быть неявно преобразован в список INTEGER[].

Структуры

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

SELECT CAST({'a': 42} AS STRUCT(a VARCHAR));

Имена структуры также могут быть в другом порядке. Поля структуры будут переупорядочены в соответствии с именами структур.

SELECT CAST({'a': 42, 'b': 84} AS STRUCT(b VARCHAR, a VARCHAR));

Объединения

Правила преобразования объединений можно найти на странице UNION type page.

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

Spec-Zone.ru

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