文字列へのキャスト(出力)
Boolean 型
値が true の場合は 1 を、それ以外の場合は 0 を返します。
select cast(true as string) , cast(false as string);
+----------------------+-----------------------+
| cast(true as string) | cast(false as string) |
+----------------------+-----------------------+
| 1 | 0 |
+----------------------+-----------------------+
整数型
数値を十進数形式で変換し、先頭に 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" に変換されます。
-
-
-
書式の規則:
-
C の printf における書式指定子 'g' の動作(https://en.cppreference.com/w/c/io/fprintf を参照)に従い、値と有効桁数に応じて浮動小数点数を通常の十進表記または指数表記に変換します。有効桁数は 7 に設定されます。'e' 形式で変換した結果の指数を X とすると、次の規則が適用されます。
-
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" に変換されます。
-
-
-
書式の規則:
-
C の printf における書式指定子 'g' の動作(https://en.cppreference.com/w/c/io/fprintf を参照)に従い、値と有効桁数に応じて浮動小数点数を通常の十進表記または指数表記に変換します。有効桁数は 16 に設定されます。'e' 形式で変換した結果の指数を X とすると、次の規則が適用されます。
-
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 桁未満の場合は、ゼロで埋めます。たとえば、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 |
+-----------------------------------------------------------+
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 型は "時:分:秒" 形式で出力されます。時は 2 桁以上 3 桁以下で、負の値も取れます。分と秒は常に 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 の変換を参照してください。