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
数値の10進形式に従って変換し、プレフィックス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(Not a Number) は文字列 "NaN" に変換される -
Infinityは文字列 "Infinity" に変換される -
-Infinityは文字列 "-Infinity" に変換される
-
-
符号の処理:
-
負の数には '-' プレフィックスが付く
-
正の数には符号プレフィックスが付かない
-
ゼロ値の特殊な処理:
-
-0.0は "-0" に変換される -
+0.0は "0" に変換される
-
-
-
フォーマットルール:
-
C printf の 'g' フォーマット指定子のセマンティクス (https://en.cppreference.com/w/c/io/fprintf を参照) を使用して、値と有効桁数に応じて浮動小数点数を10進記法または科学記法に変換する。有効桁数は7に設定される。'e' スタイル変換結果の指数Xが:
-
7 > X >= -4 の場合、結果は10進記法を使用する
-
そうでなければ、小数点以下最大6桁の有効桁数で科学記法を使用する
-
小数点以下の末尾のゼロを削除する
-
小数点以下に桁がない場合、小数点を削除する
-
例:
| float | string | comment |
|---|---|---|
| 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(Not a Number) は文字列 "NaN" に変換される -
Infinityは文字列 "Infinity" に変換される -
-Infinityは文字列 "-Infinity" に変換される
-
-
符号の処理:
-
負の数には '-' プレフィックスが付く
-
正の数には符号プレフィックスが付かない
-
ゼロ値の特殊な処理:
-
-0.0は "-0" に変換される -
+0.0は "0" に変換される
-
-
-
フォーマットルール:
-
C printf の 'g' フォーマット指定子のセマンティクス (https://en.cppreference.com/w/c/io/fprintf を参照) を使用して、値と有効桁数に応じて浮動小数点数を10進記法または科学記法に変換する。有効桁数は16に設定される。'e' スタイル変換結果の指数Xが:
-
16 > X >= -4 の場合、結果は10進記法を使用する
-
そうでなければ、小数点以下最大15桁の有効桁数で科学記法を使用する
-
小数点以下の末尾のゼロを削除する
-
小数点以下に桁がない場合、小数点を削除する
-
例:
| double | string | comment |
|---|---|---|
| 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
数値のdecimalフォーマットに従って変換する。非負の数には '+' プレフィックスが付かず、負の数には '-' プレフィックスが付き、プレフィックス0は付かない。
Decimal(P[,S]) タイプの場合、出力時には常に小数点以下S桁を表示する。小数点以下の桁数がSより少ない場合、ゼロで埋められる。例えば、Decimal(18, 6) タイプの数値 123.456 は 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」形式で出力されます。hourは最大3桁、最小2桁で、負の値も可能です。minuteとsecondは常に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コロン16進記法です:
- 最長の連続するゼロセグメントを見つけて
ダブルコロンで圧縮する。 - 非ゼログループは16進数で表現する(先頭のゼロを除去)。
- グループは
:で区切る。
特別な処理
-
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 |
+-----------------------------+