Перейти к содержимому
Последнее обновление

Выражение 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.

Преимущества строгого режима:

  1. Он предотвращает получение неожиданных значений при выполнении операций CAST
  2. Система может исходить из того, что все данные успешно преобразуются к нужному типу (недопустимые данные сразу вызывают ошибки), что позволяет лучше оптимизировать вычисления

Примеры​

Обычное преобразование 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:

Неявное преобразование 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 |
+----------------+------------+