Приведение к типу 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 |
+-----------------------------------------------------------+
Тип 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 |
+-----------------------------+