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

Приведение к типу 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 в строки:

  1. Обработка специальных значений:

    • NaN (не число) преобразуется в строку "NaN"

    • Infinity преобразуется в строку "Infinity"

    • -Infinity преобразуется в строку "-Infinity"

  2. Обработка знака:

    • Отрицательные числа имеют префикс '-'

    • Положительные числа выводятся без знака

    • Особая обработка нулевых значений:

      • -0.0 преобразуется в "-0"

      • +0.0 преобразуется в "0"

  3. Правила форматирования:

    • Используется семантика спецификатора формата 'g' функции printf языка C (см. https://en.cppreference.com/w/c/io/fprintf) для преобразования чисел с плавающей точкой в десятичную или экспоненциальную запись в зависимости от значения и количества значащих цифр. Количество значащих цифр равно 7. Формат выбирается по показателю степени X результата преобразования в формате 'e':

    • Если 7 > X >= -4, используется десятичная запись

    • В остальных случаях используется экспоненциальная запись, содержащая не более 6 значащих цифр после десятичной точки

    • Завершающие нули после десятичной точки удаляются

    • Если после десятичной точки нет цифр, точка удаляется

Пример:

floatstringкомментарий
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 в строки:

  1. Обработка специальных значений:

    • NaN (не число) преобразуется в строку "NaN"

    • Infinity преобразуется в строку "Infinity"

    • -Infinity преобразуется в строку "-Infinity"

  2. Обработка знака:

    • Отрицательные числа имеют префикс '-'

    • Положительные числа выводятся без знака

    • Особая обработка нулевых значений:

      • -0.0 преобразуется в "-0"

      • +0.0 преобразуется в "0"

  3. Правила форматирования:

    • Используется семантика спецификатора формата 'g' функции printf языка C (см. https://en.cppreference.com/w/c/io/fprintf) для преобразования чисел с плавающей точкой в десятичную или экспоненциальную запись в зависимости от значения и количества значащих цифр. Количество значащих цифр равно 16. Формат выбирается по показателю степени X результата преобразования в формате 'e':

    • Если 16 > X >= -4, используется десятичная запись

    • В остальных случаях используется экспоненциальная запись, содержащая не более 15 значащих цифр после десятичной точки

    • Завершающие нули после десятичной точки удаляются

    • Если после десятичной точки нет цифр, точка удаляется

Пример:

doublestringкомментарий
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​

  1. Строковое представление массива начинается с открывающей квадратной скобки [ и заканчивается закрывающей квадратной скобкой ].

  2. Пустой массив представляется как [].

  3. Элементы массива в строке разделяются запятой с последующим пробелом ", ".

  4. Если элемент массива имеет строковый тип, его строковое представление заключается в одинарные кавычки '.

  5. Элементы нестроковых типов напрямую преобразуются в собственное строковое представление без добавления кавычек.

  6. Если элемент массива равен NULL, он представляется строкой null.

select cast(array(1,2,3,4) as string);
+--------------------------------+
| cast(array(1,2,3,4) as string) |
+--------------------------------+
| [1, 2, 3, 4] |
+--------------------------------+

Map​

  1. Строковое представление Map начинается с открывающей фигурной скобки { и заканчивается закрывающей фигурной скобкой }.

  2. Если Map пуст, его строковое представление имеет вид {}.

  3. Пары ключ-значение в строковом представлении Map разделяются запятой с последующим пробелом ", ".

  4. Представление ключей:

    • Если ключ имеет строковый тип, его строковое представление заключается в двойные кавычки ".

    • Если ключ равен NULL, он представляется строкой null.

    • Ключи нестроковых типов напрямую преобразуются в собственное строковое представление без добавления кавычек.

  5. Представление значений:

    • Если значение имеет строковый тип, его строковое представление заключается в двойные кавычки ".

    • Если значение равно NULL, оно представляется строкой null.

    • Значения нестроковых типов напрямую преобразуются в собственное строковое представление без добавления кавычек.

  6. Структура пары ключ-значение: каждая пара представляется в виде key:value, где ключ и значение разделены двоеточием :.

select cast(map("abc",123,"def",456) as string);
+------------------------------------------+
| cast(map("abc",123,"def",456) as string) |
+------------------------------------------+
| {"abc":123, "def":456} |
+------------------------------------------+

Struct​

  1. Строковое представление Struct начинается с открывающей фигурной скобки { и заканчивается закрывающей фигурной скобкой }.

  2. Если Struct пуст, его строковое представление имеет вид {}.

  3. В строковом представлении Struct отображаются только значения, без имён полей.

  4. Представление значений:

    • Если значение имеет строковый тип, его строковое представление заключается в двойные кавычки ".

    • Если значение равно NULL, оно представляется строкой null.

    • Значения нестроковых типов напрямую преобразуются в собственное строковое представление без добавления кавычек.

  5. Значения разделяются запятой с последующим пробелом ", ".

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 с разделением двоеточиями:

  1. Находится самая длинная последовательность нулевых групп и сжимается до ::.
  2. Ненулевые группы представляются в шестнадцатеричном формате без ведущих нулей.
  3. Группы разделяются символом :.

Особые случаи​

  1. Отображение 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. Правила сжатия нулей:

    • Сжимается только самая длинная последовательность нулевых групп.
    • Для сжатия требуется не менее 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.