メインコンテンツまでスキップ

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値を文字列に変換する詳細なルール:

  1. 特殊値の処理:

    • NaN (Not a Number) は文字列 "NaN" に変換される

    • Infinity は文字列 "Infinity" に変換される

    • -Infinity は文字列 "-Infinity" に変換される

  2. 符号の処理:

    • 負の数には '-' プレフィックスがある

    • 正の数には符号プレフィックスがない

    • ゼロ値の特殊な処理:

      • -0.0 は "-0" に変換される

      • +0.0 は "0" に変換される

  3. フォーマットルール:

    • C printf 'g' フォーマット指定子のセマンティクス(https://en.cppreference.com/w/c/io/fprintf を参照)を使用して、値と有効桁数に応じて浮動小数点数を十進記法または科学記法に変換する。有効桁数は7に設定される。'e' スタイル変換結果の指数Xが次の場合:

    • 7 > X >= -4 の場合、結果は十進記法を使用する

    • それ以外の場合、小数点以下最大6桁の有効桁数で科学記法を使用する

    • 小数点以下の末尾のゼロを削除する

    • 小数点以下に桁がない場合、小数点を削除する

例:

floatstringcomment
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 (Not a Number) は文字列 "NaN" に変換される

    • Infinity は文字列 "Infinity" に変換される

    • -Infinity は文字列 "-Infinity" に変換される

  2. 符号の処理:

    • 負の数には '-' プレフィックスがある

    • 正の数には符号プレフィックスがない

    • ゼロ値の特殊な処理:

      • -0.0 は "-0" に変換される

      • +0.0 は "0" に変換される

  3. フォーマットルール:

    • C printf 'g' フォーマット指定子のセマンティクス(https://en.cppreference.com/w/c/io/fprintf を参照)を使用して、値と有効桁数に応じて浮動小数点数を十進記法または科学記法に変換する。有効桁数は16に設定される。'e' スタイル変換結果の指数Xが次の場合:

    • 16 > X >= -4 の場合、結果は十進記法を使用する

    • それ以外の場合、小数点以下最大15桁の有効桁数で科学記法を使用する

    • 小数点以下の末尾のゼロを削除する

    • 小数点以下に桁がない場合、小数点を削除する

例:

doublestringcomment
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

  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コロン16進表記法です:

  1. 最も長い連続するゼロセグメントを見つけ、:: で圧縮します。
  2. ゼロ以外のグループは16進数で表現します(先頭のゼロを除去)。
  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 |
+-----------------------------+