Выражение 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: операции 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
- Преобразование в TIMESTAMP_NS
- Преобразование в TIMESTAMPTZ
- Преобразование в целочисленные типы (INT и др.)
- Преобразование в типы с плавающей точкой (FLOAT/DOUBLE)
- Преобразование в DECIMAL
- Преобразование в CHAR/VARCHAR/STRING
- Преобразование в JSON / Из JSON в другие типы
- Преобразование в MAP
- Преобразование в STRUCT
- Преобразование в IP
Неявное преобразование CAST
Некоторые функции могут вызывать неявные преобразования CAST, что в определённых случаях приводит к неожиданному поведению. Чтобы проверить, происходит ли неявное преобразование CAST, используйте оператор EXPLAIN:
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 |
+----------------+------------+