Выражение CAST
Введение
CAST преобразует значение одного типа данных в другой тип данных. TRY_CAST обеспечивает безопасное преобразование типов: если преобразование не удаётся, возвращается значение SQL NULL вместо ошибки.
Синтаксис
CAST( <source_expr> AS <target_data_type> )
TRY_CAST( <source_expr> AS <target_data_type> )
Аргументы
- source_expr
Выражение любого поддерживаемого типа данных, которое требуется преобразовать в другой тип данных. - target_data_type
Целевой тип данных. Если тип поддерживает дополнительные свойства (например, точность и масштаб для DECIMAL(p, s)), укажите их при необходимости.
Строгий режим
До версии Doris 4.0 поведение CAST в Doris соответствовало подходу таких систем баз данных, как MySQL: Doris старался избегать ошибок при выполнении операций CAST. Например, выполнение следующего SQL-запроса в MySQL:
select cast('abc' as signed);
Давало следующий результат:
0
Начиная с Doris 4.0 используется более строгий подход, принятый в PostgreSQL: при недопустимом преобразовании Doris сразу сообщает об ошибке вместо того, чтобы возвращать результат, который может ввести в заблуждение.
В Doris 4.0 появилась новая переменная enable_strict_cast, которую можно включить следующим образом:
set enable_strict_cast = true;
В строгом режиме недопустимые операции CAST сразу приводят к ошибкам:
mysql> select cast('abc' as int);
ERROR 1105 (HY000): errCode = 2, detailMessage = abc can't cast to INT in strict mode.
Преимущества строгого режима:
- Он предотвращает получение неожиданных значений при выполнении операций CAST.
- Система может исходить из того, что все данные успешно преобразуются в нужный тип (недопустимые данные сразу вызывают ошибку), что позволяет лучше оптимизировать вычисления.
Примеры
Обычное преобразование CAST
SELECT CAST('123' AS INT);
+--------------------+
| cast('123' as int) |
+--------------------+
| 123 |
+--------------------+
Использование TRY_CAST для обработки преобразований, которые могут завершиться ошибкой
Начиная с версии 4.1.5 арифметическое переполнение при преобразовании также приводит к возврату NULL для соответствующей строки вместо сбоя всего запроса TRY_CAST. Внутренние ошибки выполнения и неподдерживаемые преобразования типов по-прежнему могут приводить к сбою; TRY_CAST подавляет не все ошибки.
Если преобразование может завершиться ошибкой, TRY_CAST позволяет избежать ошибки запроса, возвращая NULL:
SELECT TRY_CAST('abc' AS INT);
+------------------------+
| try_cast('abc' as int) |
+------------------------+
| NULL |
+------------------------+
Поведение
Преобразования CAST подразделяются по целевому типу target_data_type:
- Преобразование в ARRAY
- Преобразование в BOOLEAN
- Преобразование в DATE
- Преобразование в TIME
- Преобразование в DATETIME
- Преобразование в TIMESTAMPTZ
- Преобразование в целочисленные типы (INT и др.)
- Преобразование в типы с плавающей точкой (FLOAT/DOUBLE)
- Преобразование в DECIMAL
- Преобразование в JSON / из JSON в другие типы
- Преобразование в MAP
- Преобразование в STRUCT
- Преобразование в IP
Неявное преобразование CAST
Некоторые функции могут вызывать неявные преобразования CAST, что в определённых случаях приводит к неожиданному поведению. С помощью оператора EXPLAIN можно проверить, выполняется ли неявное преобразование CAST:
EXPLAIN SELECT length(123);
...
length(CAST(123 AS varchar(65533)))
...
Из приведённого выше плана выполнения видно, что система автоматически выполняет преобразование CAST, переводя целое число 123 в строковый тип. Это пример неявного преобразования CAST.
Арифметическое переполнение и входное значение NULL:
SELECT TRY_CAST(CAST(1000 AS DECIMAL(9, 0)) AS DECIMAL(3, 0)) AS overflow_value,
TRY_CAST(NULL AS INT) AS null_value;
+----------------+------------+
| overflow_value | null_value |
+----------------+------------+
| NULL | NULL |
+----------------+------------+