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

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

Тип 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 |
+-----------------------------+