Приведение к типу String (вывод)
Boolean
Если значение равно true, возвращается 1. В противном случае возвращается 0.
select cast(true as string) , cast(false as string);
+----------------------+-----------------------+
| cast(true as string) | cast(false as string) |
+----------------------+-----------------------+
| 1 | 0 |
+----------------------+-----------------------+
Integer
Числовое значение преобразуется в строку в десятичном формате без ведущего 0. У неотрицательных чисел нет префикса '+', у отрицательных чисел есть префикс '-'.
Пример:
select cast(cast("123" as int) as string) as str_value;
+-----------+
| str_value |
+-----------+
| 123 |
+-----------+
select cast(cast("-2147483648" as int) as string) as str_value;
+-------------+
| str_value |
+-------------+
| -2147483648 |
+-------------+
Float
Подробные правила преобразования значений типа float в строки:
-
Обработка специальных значений:
-
NaN(не число) преобразуется в строку "NaN" -
Infinityпреобразуется в строку "Infinity" -
-Infinityпреобразуется в строку "-Infinity"
-
-
Обработка знака:
-
Отрицательные числа имеют префикс '-'
-
Положительные числа выводятся без знака
-
Особая обработка нулевых значений:
-
-0.0преобразуется в "-0" -
+0.0преобразуется в "0"
-
-
-
Правила форматирования:
-
Используется семантика спецификатора формата 'g' функции printf языка C (см. https://en.cppreference.com/w/c/io/fprintf) для преобразования чисел с плавающей точкой в десятичную или экспоненциальную запись в зависимости от значения и количества значащих цифр. Количество значащих цифр равно 7. Формат выбирается по показателю степени X результата преобразования в формате 'e':
-
Если 7 > X >= -4, используется десятичная запись
-
В остальных случаях используется экспоненциальная запись, содержащая не более 6 значащих цифр после десятичной точки
-
Завершающие нули после десятичной точки удаляются
-
Если после десятичной точки нет цифр, точка удаляется
-
Пример:
| float | string | комментарий |
|---|---|---|
| 123.456 | "123.456" | |
| 1234567 | "1234567" | |
| 123456.12345 | "123456.1" | e < 7, экспоненциальная запись не используется, 7 значащих цифр |
| 12345678.12345 | "1.234568e+07" | e >= 7, используется экспоненциальная запись, 7 значащих цифр |
| 0.0001234567 | "0.0001234567" | e >= -4, экспоненциальная запись не используется |
| -0.0001234567 | "-0.0001234567" | e >= -4, экспоненциальная запись не используется |
| 0.00001234567 | "1.234567e-05" | e < -4, используется экспоненциальная запись |
| 123.456000 | "123.456" | Удаление завершающих нулей |
| 123.000 | "123" | Удаление десятичной точки |
| 0.0 | "0" | |
| -0.0 | "-0" | Отрицательный ноль |
| NaN | "NaN" | |
| Infinity | "Infinity" | |
| -Infinity | "-Infinity" |
Double
Подробные правила преобразования значений типа double в строки:
-
Обработка специальных значений:
-
NaN(не число) преобразуется в строку "NaN" -
Infinityпреобразуется в строку "Infinity" -
-Infinityпреобразуется в строку "-Infinity"
-
-
Обработка знака:
-
Отрицательные числа имеют префикс '-'
-
Положительные числа выводятся без знака
-
Особая обработка нулевых значений:
-
-0.0преобразуется в "-0" -
+0.0преобразуется в "0"
-
-
-
Правила форматирования:
-
Используется семантика спецификатора формата 'g' функции printf языка C (см. https://en.cppreference.com/w/c/io/fprintf) для преобразования чисел с плавающей точкой в десятичную или экспоненциальную запись в зависимости от значения и количества значащих цифр. Количество значащих цифр равно 16. Формат выбирается по показателю степени X результата преобразования в формате 'e':
-
Если 16 > X >= -4, используется десятичная запись
-
В остальных случаях используется экспоненциальная запись, содержащая не более 15 значащих цифр после десятичной точки
-
Завершающие нули после десятичной точки удаляются
-
Если после десятичной точки нет цифр, точка удаляется
-
Пример:
| double | string | комментарий |
|---|---|---|
| 1234567890123456.12345 | "1234567890123456" | e < 16, экспоненциальная запись не используется; 16 значащих цифр |
| 12345678901234567.12345 | "1.234567890123457e+16" | e >= 16, используется экспоненциальная запись; 16 значащих цифр |
| 0.0001234567890123456789 | "0.0001234567890123457" | e >= -4, экспоненциальная запись не используется; 16 значащих цифр |
| 0.000000000000001234567890123456 | "1.234567890123456e-15" | e < -4, используется экспоненциальная запись; 16 значащих цифр |
| 123.456000 | "123.456" | Удаление завершающих нулей |
| 123.000 | "123" | Удаление десятичной точки в конце числа |
| 0.0 | "0" | |
| -0.0 | "-0" | Отрицательный ноль |
| NaN | "NaN" | |
| Infinity | "Infinity" | |
| -Infinity | "-Infinity" |
Decimal
Числовое значение преобразуется в строку в десятичном формате. У неотрицательных чисел нет префикса '+', у отрицательных чисел есть префикс '-'; ведущий 0 не добавляется.
Для типа Decimal(P[,S]) при выводе всегда отображается S цифр после десятичной точки. Если цифр в дробной части меньше S, она дополняется нулями. Например, число 123.456 типа Decimal(18, 6) преобразуется в 123.456000.
Пример:
select cast(cast("123.456" as decimal(18, 6)) as string) as str_value;
+------------+
| str_value |
+------------+
| 123.456000 |
+------------+
select cast(cast("-2147483648" as decimalv3(12, 2)) as string) as str_value;
+----------------+
| str_value |
+----------------+
| -2147483648.00 |
+----------------+
Date
Тип Date выводится в формате "yyyy-MM-dd": год из 4 цифр, месяц из 2 цифр и день из 2 цифр, разделённые символом "-".
Пример:
select cast(date('20210304') as string);
+----------------------------------+
| cast(date('20210304') as string) |
+----------------------------------+
| 2021-03-04 |
+----------------------------------+
Datetime
Тип Datetime выводится в формате "yyyy-MM-dd HH:mm:ss[.SSSSSS]". Если Scale типа не равен 0, выводятся десятичная точка и Scale цифр дробной части секунд. Пример:
select cast(cast('20210304' as datetime) as string);
+----------------------------------------------+
| cast(cast('20210304' as datetime) as string) |
+----------------------------------------------+
| 2021-03-04 00:00:00 |
+----------------------------------------------+
select cast(cast('20020304121212.123' as datetime(3)) as string);
+-----------------------------------------------------------+
| cast(cast('20020304121212.123' as datetime(3)) as string) |
+-----------------------------------------------------------+
| 2002-03-04 12:12:12.123 |
+-----------------------------------------------------------+
TIMESTAMP_NS
TIMESTAMP_NS выводится в формате yyyy-MM-dd HH:mm:ss.SSSSSSSSS. Дробная часть секунд всегда содержит ровно девять цифр, включая завершающие нули. Часовой пояс в выводе отсутствует.
То же представление используется при преобразовании в CHAR, VARCHAR или STRING. Если на вход подан NULL, возвращается NULL.
SELECT CAST(CAST('2024-02-29 12:34:56.123456' AS TIMESTAMP_NS) AS STRING) AS str_value;
+-------------------------------+
| str_value |
+-------------------------------+
| 2024-02-29 12:34:56.123456000 |
+-------------------------------+
Time
Тип Time выводится в формате "hour:minute:second". Часы могут содержать не более 3 и не менее 2 цифр и могут быть отрицательными; минуты и секунды всегда содержат 2 цифры. Если Scale типа не равен 0, выводятся десятичная точка и Scale цифр дробной части секунд.
Пример:
select cast(cast('0' as time) as string);
+-----------------------------------+
| cast(cast('0' as time) as string) |
+-----------------------------------+
| 00:00:00 |
+-----------------------------------+
select cast(cast('2001314' as time(3)) as string);
+--------------------------------------------+
| cast(cast('2001314' as time(3)) as string) |
+--------------------------------------------+
| 200:13:14.000 |
+--------------------------------------------+
select cast(cast('-2001314.123' as time(3)) as string);
+-------------------------------------------------+
| cast(cast('-2001314.123' as time(3)) as string) |
+-------------------------------------------------+
| -200:13:14.123 |
+-------------------------------------------------+
Array
-
Строковое представление массива начинается с открывающей квадратной скобки
[и заканчивается закрывающей квадратной скобкой]. -
Пустой массив представляется как
[]. -
Элементы массива в строке разделяются запятой с последующим пробелом
", ". -
Если элемент массива имеет строковый тип, его строковое представление заключается в одинарные кавычки
'. -
Элементы нестроковых типов напрямую преобразуются в собственное строковое представление без добавления кавычек.
-
Если элемент массива равен
NULL, он представляется строкойnull.
select cast(array(1,2,3,4) as string);
+--------------------------------+
| cast(array(1,2,3,4) as string) |
+--------------------------------+
| [1, 2, 3, 4] |
+--------------------------------+
Map
-
Строковое представление Map начинается с открывающей фигурной скобки
{и заканчивается закрывающей фигурной скобкой}. -
Если Map пуст, его строковое представление имеет вид
{}. -
Пары ключ-значение в строковом представлении Map разделяются запятой с последующим пробелом
", ". -
Представление ключей:
-
Если ключ имеет строковый тип, его строковое представление заключается в двойные кавычки
". -
Если ключ равен
NULL, он представляется строкойnull. -
Ключи нестроковых типов напрямую преобразуются в собственное строковое представление без добавления кавычек.
-
-
Представление значений:
-
Если значение имеет строковый тип, его строковое представление заключается в двойные кавычки
". -
Если значение равно
NULL, оно представляется строкойnull. -
Значения нестроковых типов напрямую преобразуются в собственное строковое представление без добавления кавычек.
-
-
Структура пары ключ-значение: каждая пара представляется в виде
key:value, где ключ и значение разделены двоеточием:.
select cast(map("abc",123,"def",456) as string);
+------------------------------------------+
| cast(map("abc",123,"def",456) as string) |
+------------------------------------------+
| {"abc":123, "def":456} |
+------------------------------------------+
Struct
-
Строковое представление Struct начинается с открывающей фигурной скобки
{и заканчивается закрывающей фигурной скобкой}. -
Если Struct пуст, его строковое представление имеет вид
{}. -
В строковом представлении Struct отображаются только значения, без имён полей.
-
Представление значений:
-
Если значение имеет строковый тип, его строковое представление заключается в двойные кавычки
". -
Если значение равно
NULL, оно представляется строкойnull. -
Значения нестроковых типов напрямую преобразуются в собственное строковое представление без добавления кавычек.
-
-
Значения разделяются запятой с последующим пробелом
", ".
select struct(123,"abc",3.14);
+-----------------------------------------+
| struct(123,"abc",3.14) |
+-----------------------------------------+
| {"col1":123, "col2":"abc", "col3":3.14} |
+-----------------------------------------+
1 row in set (0.03 sec)
select cast(struct(123,"abc",3.14) as string);
+----------------------------------------+
| cast(struct(123,"abc",3.14) as string) |
+----------------------------------------+
| {123, "abc", 3.14} |
+----------------------------------------+
IPv6
Тип IPv6 выводится в стандартной шестнадцатеричной записи IPv6 с разделением двоеточиями:
- Находится самая длинная последовательность нулевых групп и сжимается до
::. - Ненулевые группы представляются в шестнадцатеричном формате без ведущих нулей.
- Группы разделяются символом
:.
Особые случаи
-
Отображение IPv4:
Если первые 6 групп равны 0, а 7-я группа равна 0 или 0xffff, последние 4 байта выводятся в формате IPv4.
Пример:select cast('::ffff:192.0.2.1' as ipv6);
+-----------------------------+
| cast('::ffff:192.0.2.1' as ipv6) |
+-----------------------------+
| ::ffff:192.0.2.1 |
+-----------------------------+ -
Правила сжатия нулей:
- Сжимается только самая длинная последовательность нулевых групп.
- Для сжатия требуется не менее 2 последовательных нулевых групп.
- Если есть несколько последовательностей нулевых групп одинаковой длины, сжимается первая из них.
Пример:
select cast('2001:0db8:0000:0000:0000:0000:1428:57ab' as ipv6);
+---------------------------------------------------------+
| cast('2001:0db8:0000:0000:0000:0000:1428:57ab' as ipv6) |
+---------------------------------------------------------+
| 2001:db8::1428:57ab |
+---------------------------------------------------------+
select cast('::192.0.2.1' as ipv6);
+-----------------------------+
| cast('::192.0.2.1' as ipv6) |
+-----------------------------+
| ::192.0.2.1 |
+-----------------------------+
UUID
Значение встроенного типа UUID выводится в каноническом текстовом формате длиной 36 символов с буквами в нижнем регистре (8-4-4-4-12), независимо от регистра букв и наличия дефисов во входном значении. Если на вход подан NULL, возвращается NULL. См. Преобразование UUID.