cast 関数

適用対象: 「はい」のチェック マーク Databricks SQL 「はい」のチェック マーク Databricks Runtime

expr の値をターゲット データ型 type にキャストします。 この演算子は、:: (コロンコロン記号) 演算子のシノニムです

構文

cast(sourceExpr AS targetType)

引数

  • sourceExpr: 任意のキャスト可能な式。
  • targetType: 結果のデータ型。

戻り値

結果は targetType 型です。

キャストするデータ型は次の組み合わせが有効です。

ソース (行) ターゲット (列) VOID numeric STRING DATE TIMESTAMP TIMESTAMP_NTZ 年月の間隔 日付と時刻の間隔 BOOLEAN BINARY ARRAY MAP STRUCT VARIANT OBJECT
VOID Y N
numeric N Y N N Y N N N N N
STRING N Y N N N N
DATE N N Y N N N N N N N N
TIMESTAMP N Y N N N N N N N N
TIMESTAMP_NTZ N N Y N N N N N N N N
年月の間隔 N Y N N N N N N N N N N N
日付と時刻の間隔 N Y N N N N N N N N N N N
BOOLEAN N Y N N N N N N N N N
BINARY N Y N N N N N N N N N N
ARRAY N N N N N N N N N N N N
MAP N N N N N N N N N N N N N
STRUCT N N N N N N N N N N N N N
VARIANT N Y N N Y N
OBJECT N N N N N N N N N N N Y N N

targetType に基づく規則と制限事項

警告

Databricks Runtime では、spark.sql.ansi.enabledfalse の場合に、オーバーフローが原因でエラーが発生せず、代わりに結果が "ラップ" されます。

targetType にとって無効な形式または無効な文字を持つ sourceExpr 値を指定すると、結果は NULL になります。

numeric

targetType数値sourceExpr が次の型の場合:

  • VOID

    結果は、指定された数値型の NULL です。

  • numeric

    targetType整数の場合、結果は整数にsourceExpr 切り捨てられます

    それ以外の場合、結果は targetType の使用可能なスケールに合わせてsourceExpr丸められます

    値が targetType の範囲外の場合は、オーバーフロー エラーが発生します。

    try_cast を使用してオーバーフロー エラーを NULL に変換します。

  • STRING

    sourceExprtargetType のリテラル値として読み取られます。

    sourceExpr がリテラル値の形式に準拠していない場合、エラーが発生します。

    値が targetType の範囲外の場合は、オーバーフロー エラーが発生します。

    try_cast を使用して、オーバーフロー エラーや無効な形式エラーを NULL に変換します。

  • TIMESTAMP

    結果は、1970-01-01 00:00:00 UTCsourceExpr の間で経過した秒数になります。

    targetType整数の場合、結果は整数に切り捨てられます

    それ以外の場合、結果は targetType の使用可能なスケールに合わせて丸められます

    結果が targetType の範囲外の場合は、オーバーフロー エラーが発生します。

    try_cast を使用してオーバーフロー エラーを NULL に変換します。

  • INTERVAL

    適用対象: check marked yes Databricks SQL 「はい」のチェック マーク Databricks Runtime 11.3 LTS 以上

    対象の型は真数である必要があります。

    INTERVAL upper_unit TO lower_unit を指定すると、lower_unit の合計数で結果が測定されます。 lower_unitSECOND の場合、秒の小数部が小数点の右側に格納されます。 それ以外のすべての間隔では、結果は常に整数です。

  • BOOLEAN

    sourceExpr が次の場合:

    • true: 結果は 1 です。
    • false: 結果は 0 です。
    • NULL: 結果は NULL です。
  • VARIANT

    VARIANT 型の実際の値の型の規則が適用されます。

> SELECT cast(NULL AS INT);
  NULL

> SELECT cast(5.6 AS INT);
  5

> SELECT cast(5.6 AS DECIMAL(2, 0));
  6

> SELECT cast(-5.6 AS INT);
  -5

> SELECT cast(-5.6 AS DECIMAL(2, 0));
  -6

> SELECT cast(128 AS TINYINT);
  Overflow

> SELECT cast(128 AS DECIMAL(2, 0));
  Overflow

> SELECT cast('123' AS INT);
  123

> SELECT cast('123.0' AS INT);
  Invalid format

> SELECT cast(TIMESTAMP'1970-01-01 00:00:01' AS LONG);
  1

> SELECT cast(TIMESTAMP'1970-01-01 00:00:00.000001' AS DOUBLE);
  1.0E-6

> SELECT cast(TIMESTAMP'2022-02-01 00:00:00' AS SMALLINT);
  error: overflow
> SELECT cast(true AS BOOLEAN);
  1

> SELECT cast(INTERVAL '1-2' YEAR TO MONTH AS INTEGER);
  14

> SELECT cast(INTERVAL '1:30.5' MINUTE TO SECOND AS DECIMAL(5, 2));
  90.50

> SELECT cast(TRUE AS INT);
  1

> SELECT cast(FALSE AS INT);
  0

> SELECT cast('15'::VARIANT AS INT);
  15

STRING

targetTypeSTRING 型sourceExpr が次の型の場合:

  • VOID

    結果は NULL 文字列です。

  • 正確な数値

    結果は、省略可能なマイナス記号を持ち、小数点の左側の 1 桁を除き先頭に 0 がないリテラル数になります。 targetType が、s が 0 より大きい DECIMAL(p, s) である場合は、小数点が追加され、後置ゼロが小数点以下桁数まで追加されます。

  • 浮動小数点バイナリ

    絶対数が 10,000,000 より小さく、0.001 以上の場合、結果は、指数表記を使用せず、小数点の両側に少なくとも 1 桁を使用して表されます。

    それ以外の場合、Azure Databricks では仮数の後に E と指数を続けた表記が使用されます。 仮数には、省略可能な先頭のマイナス記号の後に、小数点の左側に 1 桁の数字が続き、0 より大きい最小桁数が右側に含まれます。 指数部には、省略可能な先頭のマイナス記号があります。

  • DATE

    年が 9999 BCE から 9999 CE の間の場合、結果はそれぞれ -YYYY-MM-DDYYYY-MM-DD の形式の dateString になります。

    この範囲より前または後の年の場合、必要な桁数が年部分に追加され、CE を表すために + が使用されます。

  • TIMESTAMP

    年が 9999 BCE から 9999 CE の間の場合、結果はそれぞれ -YYYY-MM-DD hh:mm:ssYYYY-MM-DD hh:mm:ss の形式の timestampString になります。

    この範囲より前または後の年の場合、必要な桁数が年部分に追加され、CE を表すために + が使用されます。

    必要に応じて秒の小数部 .f... が追加されます。

  • TIMESTAMP_NTZ

    年が 9999 BCE から 9999 CE の間の場合、結果はそれぞれ -YYYY-MM-DD hh:mm:ssYYYY-MM-DD hh:mm:ss の形式の timestampString になります。

    この範囲より前または後の年の場合、必要な桁数が年部分に追加され、CE を表すために + が使用されます。

    必要に応じて秒の小数部 .f... が追加されます。

  • 年月の間隔

    結果は、間隔リテラルの最も短い表現になります。 間隔が負の場合、記号は interval-string に埋め込まれます。 10 より小さい単位の場合、先頭のゼロは省略されます。

    一般的な年月の間隔の文字列の形式は次のとおりです。

    • INTERVAL 'Y' YEAR
    • INTERVAL 'Y-M' YEAR TO MONTH
    • INTERVAL 'M' MONTH
  • day-time interval

    結果は、間隔リテラルの最も短い表現になります。 間隔が負の場合、記号は interval-string に埋め込まれます。 10 より小さい単位の場合、先頭のゼロは省略されます。

    一般的な日時の間隔の文字列の形式は次のとおりです。

    • INTERVAL 'D' DAY
    • INTERVAL 'D h' DAY TO HOUR
    • INTERVAL 'D h:m' DAY TO MINUTE
    • INTERVAL 'D h:m:s' DAY TO SECOND
    • INTERVAL 'h' HOUR
    • INTERVAL 'h:m' HOUR TO MINUTE
    • INTERVAL 'm:s' MINUTE TO SECOND
    • INTERVAL 's' SECOND
  • BOOLEAN

    true ブール値の結果は STRING 型のリテラル true です。 false の場合は STRING 型のリテラル false です。 NULL の場合は NULL 文字列です。

  • BINARY

    結果は、UTF-8 文字シーケンスとして解釈されるバイナリ sourceExpr です。

    Azure Databricks では、UTF-8 文字は検証されません。 BINARY から STRING の強制型変換により、置換文字が挿入されたり、エラーが発生したりすることはありません。

  • ARRAY

    結果は、角かっこ [ ] で囲まれた強制型変換要素のコンマ区切りのリストになります。 各コンマの後に 1 つのスペースが置かれます。 NULL 要素はリテラル null に変換されます。

    Azure Databricks では、個々の要素が引用符で囲まれたり、他の方法でマークされたりしません。要素自体に角かっこやコンマが含まれている可能性があります。

  • MAP

    結果は、中かっこ { } で囲まれた、キャスト キーと値のペアのコンマ区切りリストになります。 各コンマの後に 1 つのスペースが置かれます。 キーと値のペアはそれぞれ、-> で区切られます。 NULL マップ値はリテラル null に変換されます。

    Azure Databricks では、個々のキーや値が引用符で囲まれたり、他の方法でマークされたりしません。要素自体に中かっこ、コンマ、-> が含まれている可能性があります。

  • STRUCT

    結果は、中かっこ { } で囲まれた、キャスト フィールド値のコンマ区切りリストになります。 各コンマの後に 1 つのスペースが置かれます。 NULL フィールド値はリテラル null に変換されます。

    Azure Databricks では、個々のフィールド値が引用符で囲まれたり、他の方法でマークされたりしません。要素自体に中かっこやコンマが含まれている可能性があります。

  • VARIANT

    VARIANT 型の実際の値の型の規則が適用されます。

> SELECT cast(NULL AS STRING);
  NULL

> SELECT cast(-3Y AS STRING);
  -3

> SELECT cast(5::DECIMAL(10, 5) AS STRING);
  5.00000

> SELECT cast(12345678e-4 AS STRING);
  1234.5678

> SELECT cast(1e7 as string);
  1.0E7

> SELECT cast(1e6 as string);
  1000000.0

> SELECT cast(1e-4 as string);
  1.0E-4

> SELECT cast(1e-3 as string);
  0.001

> SELECT cast(12345678e7 AS STRING);
  1.2345678E14

> SELECT cast(DATE'1900-12-31' AS STRING);
  1900-12-31

-- Caesar no more
> SELECT cast(DATE'-0044-03-15' AS STRING);
  -0044-03-15

> SELECT cast(DATE'100000-12-31' AS STRING);
  +100000-12-31

> SELECT cast(current_timestamp() AS STRING);
  2022-04-02 22:29:09.783

> SELECT cast(TIMESTAMP_NTZ'2023-01-01' AS STRING);
  2023-01-01 00:00:00

> SELECT cast(INTERVAL -'13-02' YEAR TO MONTH AS STRING);
  INTERVAL '-13-2' YEAR TO MONTH

> SELECT cast(INTERVAL '12:04.9900' MINUTE TO SECOND AS STRING);
  INTERVAL '12:04.99' MINUTE TO SECOND

> SELECT cast(true AS STRING);
  true

> SELECT cast(false AS STRING);
  false

-- A bad UTF-8 string
> SELECT cast(x'33800033' AS STRING);
  3�3

> SELECT hex(cast(x'33800033' AS STRING));
  33800033

> SELECT cast(array('hello', NULL, 'world') AS STRING);
  [hello, null, world]

> SELECT cast(array('hello', 'wor, ld') AS STRING);
  [hello, wor, ld]

> SELECT cast(array() AS STRING);
  []

> SELECT cast(map('hello', 1, 'world', null) AS STRING);
  {hello -> 1, world -> null}

> SELECT cast(map('hello -> 1', DATE'2022-01-01') AS STRING);
  {hello -> 1 -> 2022-01-01}

> SELECT cast(map() AS STRING);
  {}

> SELECT cast(named_struct('a', 5, 'b', 6, 'c', NULL) AS STRING);
  {5, 6, null}

> SELECT cast(named_struct() AS STRING);
  {}

> SELECT cast(DATE'2024-01-05'::VARIANT AS STRING);
  2024-01-05

DATE

targetTypeDATE 型sourceExpr が次の型の場合:

  • VOID

    結果は NULL DATE です。

  • STRING

    sourceExpr は有効な dateString である必要があります。

    sourceExpr が有効な dateString ではない場合、Azure Databricks からエラーが返されます。

    try_cast を使用して、無効なデータ エラーを NULL に変換します。

  • TIMESTAMP

    結果はタイムスタンプ sourceExpr の日付部分になります。

  • TIMESTAMP_NTZ

    結果は timestamp_ntz sourceExpr の日付部分になります。

  • VARIANT

    VARIANT データ型によって保持される実際の値の型規則が適用されます。

> SELECT cast(NULL AS DATE);
  NULL

> SELECT cast('1900-10-01' AS DATE);
  1900-10-01

> SELECT cast('1900-10-01' AS DATE);
  1900-10-01

-- There is no February 30.
> SELECT cast('1900-02-30' AS DATE);
  Error

> SELECT cast(TIMESTAMP'1900-10-01 12:13:14' AS DATE);
  1900-10-01

> SELECT cast(TIMESTAMP_NTZ'1900-10-01 12:13:14' AS DATE);
  1900-10-01

> SELECT cast(TIMESTAMP_NTZ'1900-10-01 12:13:14'::VARIANT AS DATE);
  1900-10-01

TIMESTAMP

targetTypeTIMESTAMP 型sourceExpr が次の型の場合:

  • VOID

    結果は NULL DATE です。

  • numeric

    sourceExpr は、1970-01-01 00:00:00 UTC 以降の秒数として読み取られます。

    マイクロ秒未満の端数は切り捨てられます。

    値が TIMESTAMP の範囲外の場合は、オーバーフロー エラーが発生します。

    try_cast を使用してオーバーフロー エラーを NULL に変換します。

  • STRING

    sourceExpr は有効な timestampString である必要があります。

    sourceExpr が有効な timestampString ではない場合、Azure Databricks からエラーが返されます。

    try_cast を使用して、無効なデータ エラーを NULL に変換します。

  • DATE

    結果は sourceExprDATE と時刻 00:00:00 です。

  • TIMESTAMP_NTZ

結果は、timestamp_ntz sourceExpr の同じ年、月、日、時、分、秒フィールドを持つタイムスタンプ値です。

  • VARIANT

    VARIANT データ型によって保持される実際の値の型規則が適用されます。

> SELECT cast(NULL AS TIMESTAMP);
  NULL

> SET TIME ZONE '+00:00';
> SELECT cast(0.0 AS TIMESTAMP);
  1970-01-01 00:00:00

> SELECT cast(0.0000009 AS TIMESTAMP);
  1970-01-01 00:00:00

> SELECT cast(1e20 AS TIMESTAMP);
  Error: overflow

> SELECT cast('1900' AS TIMESTAMP);
  1900-01-01 00:00:00

> SELECT cast('1900-10-01 12:13:14' AS TIMESTAMP);
  1900-10-01 12:13:14

> SELECT cast('1900-02-30 12:13:14' AS TIMESTAMP);
  Error

> SELECT cast(DATE'1900-10-01' AS TIMESTAMP);
  1900-10-01 00:00:00

> SELECT cast(TIMESTAMP_NTZ'2023-01-01 02:03:04.567' as TIMESTAMP)
  2023-01-01 02:03:04.567

> SELECT cast(DATE'1900-10-01'::VARIANT AS TIMESTAMP);
  1900-10-01 00:00:00

TIMESTAMP_NTZ

targetTypeTIMESTAMP_NTZ 型sourceExpr が次の型の場合:

  • VOID

    結果は NULL DATE です。

  • STRING

    sourceExpr は有効な timestampString である必要があります。

    sourceExpr が有効な timestampString ではない場合、Azure Databricks からエラーが返されます。

    try_cast を使用して、無効なデータ エラーを NULL に変換します。

  • DATE

    結果は、sourceExpr DATE の 00:00:00 時になります。

  • TIMESTAMP

    結果は、セッション タイム ゾーンの sourceExpr としてローカル時刻になります。

  • VARIANT

    VARIANT データ型によって保持される実際の値の型規則が適用されます。

> SELECT cast(NULL AS TIMESTAMP_NTZ);
  NULL

> SELECT cast('1900' AS TIMESTAMP_NTZ);
  1900-01-01 00:00:00

> SELECT cast('1900-10-01 12:13:14' AS TIMESTAMP_NTZ);
  1900-10-01 12:13:14

> SELECT cast('1900-02-30 12:13:14' AS TIMESTAMP_NTZ);
  Error

> SELECT cast(DATE'1900-10-01' AS TIMESTAMP_NTZ);
  1900-10-01 00:00:00

> SELECT current_timezone(), CAST(TIMESTAMP'2021-7-1T8:43:28' as TIMESTAMP_NTZ);
  America/Los_Angeles 2021-07-01 08:43:28

> SELECT current_timezone(), CAST(TIMESTAMP'2021-7-1T8:43:28UTC+3' as TIMESTAMP_NTZ);
  America/Los_Angeles 2021-06-30 22:43:28

> SELECT cast(DATE'1900-10-01'::VARIANT AS TIMESTAMP_NTZ);
  1900-10-01 00:00:00

year-month interval

targetType年月の間隔sourceExpr が次の型の場合:

  • VOID

    結果は NULL 年月間隔です。

  • integral_numeric

    適用対象: check marked yes Databricks SQL 「はい」のチェック マーク Databricks Runtime 11.3 LTS 以上

    数値は、targetTypeyearmonthIntervalQualifier の下位単位の数として解釈されます。

  • STRING

    sourceExpr は、有効な yearMonthIntervalString である必要があります。

    sourceExpr が有効な yearMonthIntervalString ではない場合、Azure Databricks からエラーが返されます。

    try_cast を使用して、無効なデータ エラーを NULL に変換します。

  • 年月の間隔

    targetType yearMonthIntervalQualifierMONTH が含まれる場合、値は変更されませんが、ターゲットの型に一致するように再解釈されます。

    それ以外で、ソース型 yearMonthIntervalQualifierMONTH が含まれている場合、結果は完全な年に切り捨てられます。

> SELECT cast(NULL AS INTERVAL YEAR);
  NULL

> SELECT cast('1-4' AS INTERVAL YEAR TO MONTH)::STRING;
  INTERVAL '1-4' YEAR TO MONTH

> SELECT cast('1' AS INTERVAL YEAR TO MONTH);
  error

> SELECT cast(INTERVAL '1-4' YEAR TO MONTH AS INTERVAL MONTH)::STRING;
  INTERVAL '16' MONTH

> SELECT cast(14 AS INTERVAL YEAR TO MONTH)::STRING;
  INTERVAL '1-2' YEAR TO MONTH

> SELECT cast(INTERVAL '1-11' YEAR TO MONTH AS INTERVAL YEAR)::STRING;
  INTERVAL '1' YEAR

day-time interval

targetType日時の間隔sourceExpr が次の型の場合:

  • VOID

    結果は NULL 日時間隔です。

  • exact_numeric

    適用対象: check marked yes Databricks SQL 「はい」のチェック マーク Databricks Runtime 11.3 LTS 以上

    数値は、targetTypedayTimeIntervalQualifier の下位単位の数として解釈されます。 単位が SECOND である場合、小数部はすべて秒の小数部として解釈されます。

  • STRING

    sourceExpr は、有効な dayTimeIntervalString である必要があります。

    sourceExpr が有効な dayTimeIntervalString ではない場合、Azure Databricks からエラーが返されます。

    try_cast を使用して、無効なデータ エラーを NULL に変換します。

  • day-time interval

    targetType dayTimeIntervalQualifier にソース型 dayTimeIntervalQualifier の最小単位が含まれている場合、値は変更されませんが、ターゲット型と一致するように再解釈されます。

    それ以外の場合、sourceExpr 間隔は targetType の値に合わせて切り捨てられます。

> SELECT cast(NULL AS INTERVAL HOUR);
  NULL

> SELECT cast('1 4:23' AS INTERVAL DAY TO MINUTE)::STRING;
  INTERVAL '1 04:23' DAY TO MINUTE

> SELECT cast('1' AS INTERVAL DAY TO MINUTE);
  error

> SELECT cast(INTERVAL '1 4:23' DAY TO MINUTE AS INTERVAL MINUTE)::STRING;
  INTERVAL '1703' MINUTE

> SELECT cast(INTERVAL '1 4:23' DAY TO MINUTE AS INTERVAL HOUR)::STRING;
  INTERVAL '28' HOUR

> SELECT cast(125.3 AS INTERVAL MINUTE TO SECOND)::STRING;
  INTERVAL '2:5.3' MINUTE TO SECOND

BOOLEAN

targetTypeBOOLEANsourceExpr が次の型の場合:

  • VOID

    結果は BOOLEAN 型の NULL です。

  • numeric

    sourceExpr が次の場合:

    • 0: 結果は false です。

      それ以外の場合、結果は true です。

  • STRING

    sourcEexpr で大文字と小文字が区別されない場合:

    • 'T', 'TRUE', 'Y', 'YES', or '1': 結果は true です
    • 'F', 'FALSE', 'N', 'NO', or '0': 結果は false です
    • NULL: 結果は NULL です

    それ以外の場合、Azure Databricks から、ブール型エラーの無効な入力構文が返されます。

    try_cast を使用して、無効なデータ エラーを NULL に変換します。

  • VARIANT

    VARIANT 型の実際の値の型の規則が適用されます。

> SELECT cast(NULL AS BOOLEAN);
  NULL

> SELECT cast('T' AS BOOLEAN);
  true

> SELECT cast('True' AS BOOLEAN);
  true

> SELECT cast('1' AS BOOLEAN);
  true

> SELECT cast('0' AS BOOLEAN);
  false

> SELECT cast('n' AS BOOLEAN);
  false

> SELECT cast('on' AS BOOLEAN);
  error: invalid input syntax for type boolean

> SELECT cast(0 AS BOOLEAN);
  false

> SELECT cast(0.0E10 AS BOOLEAN);
  false

> SELECT cast(1 AS BOOLEAN);
  true

> SELECT cast(0.1 AS BOOLEAN);
  true

> SELECT cast('NaN'::FLOAT AS BOOLEAN);
  true

> SELECT cast(1::VARIANT AS BOOLEAN);
  true

BINARY

targetTypeBINARYsourceExpr が次の型の場合:

  • VOID

    結果は BINARY 型の NULL です。

  • STRING

    結果は、surceExpr の UTF-8 エンコードです。

  • VARIANT

    VARIANT データ型によって保持される実際の値の型規則が適用されます。

> SELECT cast(NULL AS BINARY);
  NULL

> SELECT hex(cast('Spark SQL' AS BINARY));
  537061726B2053514C

> SELECT hex(cast('Oдesa' AS BINARY));
  4FD0B4657361

> SELECT hex(cast('Oдesa'::VARIANT AS BINARY));
  4FD0B4657361

ARRAY

targetTypeARRAY < targetElementType >sourceExpr が次の型の場合:

  • VOID

    結果は targeTypeNULL です。

  • ARRAY < sourceElementType >

    sourceElementType から targetElementType への強制型変換がサポートされている場合、結果は、すべての要素が targetElementType に強制型変換された ARRAY<targetElementType> になります。

    強制型変換がサポートされていない場合や、どの要素も強制型変換できない場合、Azure Databricks でエラーが発生します。

    try_cast を使用して、無効なデータまたはオーバーフロー エラーを NULL に変換します。

  • VARIANT

    VARIANT データ型によって保持される実際の値の型規則が適用されます。

> SELECT cast(NULL AS ARRAY<INT>);
  NULL

> SELECT cast(array('t', 'f', NULL) AS ARRAY<BOOLEAN>);
  [true, false, NULL]

> SELECT cast(array('t', 'f', NULL) AS INTERVAL YEAR);
  error: cannot cast array<string> to interval year

> SELECT cast(array('t', 'f', 'o') AS ARRAY<BOOLEAN>);
  error: invalid input syntax for type boolean: o.

> SELECT cast(array('t', 'f', NULL)::VARIANT AS ARRAY<BOOLEAN>);
  [true, false, NULL]

MAP

targetTypeMAP < targetKeyType、targetValueType >sourceExpr が次の型の場合:

  • VOID

    結果は targetTypeNULL です。

  • MAP <sourceKeyType、sourceValueType>

    sourceKeyType から targetKeyType および sourceValueType から targetValueType への強制型変換がサポートされている場合、結果は、すべてのキーが targetKeyType に強制型変換され、すべての値が targetValueType に強制型変換された MAP<targetKeyType, targetValueType> になります。

    強制型変換がサポートされていない場合や、どのキーも値も強制型変換できない場合、Azure Databricks でエラーが発生します。

    try_cast を使用して、無効なデータまたはオーバーフロー エラーを NULL に変換します。

  • VARIANT

    VARIANT データ型によって保持される実際の値の型規則が適用されます。

  • OBJECT < [sourceFieldName : sourceFieldType [, …]] >

    STRING 型の sourceFieldName のそれぞれが targetKeyType にキャストされ、マップ キーにマップされます。 sourceFieldType のソース フィールド値のそれぞれが targetValueType にキャストされ、それぞれのマップ値がマップされます。

    Azure Databricks でサポートされていないキャストがある場合や、キャストできないフィールド値またはキー値がある場合は、エラーが生成されます。

    try_cast を使用して、無効なデータまたはオーバーフロー エラーを NULL に変換します。

> SELECT cast(NULL AS MAP<STRING, INT>);
  NULL

> SELECT cast(map('10', 't', '15', 'f', '20', NULL) AS MAP<INT, BOOLEAN>);
  {10 -> true, 15 -> false, 20 -> null}

> SELECT cast(map('10', 't', '15', 'f', '20', NULL) AS MAP<INT, ARRAY<INT>>);
  error: cannot cast map<string,string> to map<int,array<int>>

> SELECT cast(map('10', 't', '15', 'f', '20', 'o') AS MAP<INT, BOOLEAN>);
  error: invalid input syntax for type boolean: o.

-- Casting an OBJECT to a MAP
> SELECT schema_of_variant(parse_json('{"cars": 12, "bicycles": 5 }'));
  OBJECT<bicycles: BIGINT, cars: BIGINT>
> SELECT CAST(parse_json('{"cars": 12, "bicycles": 5 }') AS MAP<STRING, INTEGER>);
  {bicycles -> 5, cars -> 12}

STRUCT

targetTypeSTRUCT <[targetFieldName : targetFieldType [NOT NULL] [COMMENT str] [, …]]>sourceExpr が次の型の場合:

  • VOID

    結果は targetTypeNULL です。

  • STRUCT < [sourceFieldName : sourceFieldType [NOT NULL] [COMMENT str] [, …]] >

    sourceExprtargetType にキャストできるのは、次の条件すべてに当てはまる場合です。

    • ソースの型のフィールドの数がターゲットと同じである
    • すべてのフィールドの場合: sourceFieldTypeNtargetFieldTypeN に強制型変換できます。
    • すべてのフィールド値の場合: ソース フィールドの値 N は targetFieldTypeN に強制型変換でき、ターゲット フィールド N が NOT NULL としてマークされている場合、値は null ではありません。

    sourceFieldName、ソース NOT NULL 制約、ソース COMMENT は、targetType に一致する必要はなく、無視されます。

    そのキャストが Azure Databricks でサポートされていない場合や、キャストできないフィールドがある場合は、エラーが生成されます。

    try_cast を使用して、無効なデータまたはオーバーフロー エラーを NULL に変換します。

  • VARIANT

    VARIANT データ型によって保持される実際の値の型規則が適用されます。

  • OBJECT < [sourceFieldName : sourceFieldType [, …]] >

    すべての sourceFieldNamesourceFieldName に対応付けられます。 sourceFieldType のソース フィールド値のそれぞれが、対応する targetValueType にキャストされ、それぞれのマップ値にマップされます。

    targetFieldName に対応するものがない場合は、フィールド値は NULL です。

    sourceFieldName に対応するものがない場合は、そのフィールドは無視されます。

    Azure Databricks でサポートされていないキャストがある場合や、キャストできないフィールド値またはキー値がある場合は、エラーが生成されます。

    try_cast を使用して、無効なデータまたはオーバーフロー エラーを NULL に変換します。

> SELECT cast(NULL AS STRUCT<a:INT>);
  NULL

> SELECT cast(named_struct('a', 't', 'b', '1900-01-01') AS STRUCT<b:BOOLEAN, c:DATE NOT NULL COMMENT 'Hello'>);
  {"b":true,"c":1900-01-01}

> SELECT cast(named_struct('a', 't', 'b', NULL::DATE) AS STRUCT<b:BOOLEAN, c:DATE NOT NULL COMMENT 'Hello'>);
  error: cannot cast struct<a:string,b:date> to struct<b:boolean,c:date>

> SELECT cast(named_struct('a', 't', 'b', '1900') AS STRUCT<b:BOOLEAN, c:ARRAY<INT>>);
  error: cannot cast struct<a:string,b:string> to struct<b:boolean,c:array<int>>

> SELECT cast(named_struct('a', 't', 'b', 'hello') AS STRUCT<b:BOOLEAN, c:DATE>);
  error: Cannot cast hello to DateType

> SELECT cast(named_struct('a', 't', 'b', '1900-01-01')::VARIANT AS STRUCT<b:BOOLEAN, c:DATE NOT NULL COMMENT 'Hello'>);
  {"b":true,"c":1900-01-01}

-- Casting an OBJECT to a STRUCT
> SELECT schema_of_variant(parse_json('{"name": "jason", "age": 25 }'));
  OBJECT<age: BIGINT, name: STRING>
> SELECT CAST(parse_json('{"name": "jason", "age": 25 }') AS STRUCT<id: BIGINT, name: STRING>);
  {"id":null,"name":"jason"}

VARIANT

targetTypeVARIANTsourceExpr が次の型の場合:

  • VOID

    結果は VARIANT 型の NULL です。

  • numeric

    結果は、その数値を表す VARIANT です。 DECIMAL 型の精度は <= 38 であることが必要です。

    整数の数値はすべて BIGINT にマップされます。

    DECIMAL の値はすべて、その精度とスケールの幅を最小にしたものにマップされます。

  • STRING

    結果は、その STRING の値を表す VARIANT です。

  • DATE

    結果は、その DATE の値を表す VARIANT です。

  • TIMESTAMP

    結果は、その TIMESTAMP の値を表す VARIANT です。

  • TIMESTAMP_NTZ

    結果は、その TIMESTAMP NTZ の値を表す VARIANT です。

  • BOOLEAN

    結果は、その BOOLEAN の値を表す VARIANT です。

  • BINARY

    結果は、その BINARY の値を表す VARIANT です。

  • ARRAY < sourceElementType >

    sourceElementType から VARIANT へのキャストがサポートされている場合は、結果は ARRAY<sourceElementType> を表す VARIANT です。

    そのキャストが Azure Databricks でサポートされていない場合は、エラーが生成されます。

    try_cast を使用して、無効なデータまたはオーバーフロー エラーを NULL に変換します。

> SELECT cast(NULL AS VARIANT);
  NULL

> SELECT cast(5.1000 AS VARIANT);
  5.1

> SELECT schema_of_variant(cast(5 AS VARIANT));
  BIGINT