OpenText Analytics Database 旧Vertica

技術情報サイト

Analytics Database

「データ型の変換に失敗した場合の動作」および「デフォルト動作の変更方法」

公開日:
更新日:
アーキテクチャ
基本操作
#関数

はじめに

本記事では、「CAST関数を使用しデータ型の変換に失敗した場合の動作」および「デフォルト動作の変更方法」について解説します。変換できないデータが含まれている場合、CAST関数の処理は失敗します。

CAST関数に失敗した場合は、デー​​タ型によって動作が異なります。

項番

データ型

CAST関数失敗時のデフォルト動作

日付/時刻型

NULLとなる

リテラル

エラー(例:ERROR 3758)が発生する

その他のデータ型

エラー(例:ERROR 3682)が発生する


CAST関数については、以下の記事をご覧ください。

 データ型を強制的に変更する方法
 https://www.ashisuto.co.jp/cm/analytics-database/coercion_operators.html

データ型の変換の失敗例

①日付/時刻型の場合

文字データ「Vertica」と「99999」を、日付/時刻型に変換した場合の失敗例です。

## moji_suji表には、varchar型として文字と数字が格納されています。

dbadmin=> select col1 from moji_suji;
  col1
---------
 Vertica
 99999

## 日付データへの変換が失敗しています。

dbadmin=> select CAST(col1 as date) from moji_suji;
 col1
------
         ★NULL として扱われています。
         ★NULL として扱われています。
(2 rows)

②リテラルの場合

リテラル「Vertica」を、数値型に変換した場合の失敗例です。

## リテラルで文字データを数値データに変換し失敗しています。

dbadmin=> select CAST('Vertica' as number);
ERROR 3758:  Invalid syntax for numeric: "Vertica"

③その他のデータ型の場合

文字データ「Vertica」と「99999」を、数値型に変換した場合の失敗例です。

## moji_suji表には、varchar型として文字と数字が格納されています。

dbadmin=> select col1 from moji_suji;
  col1
---------
 Vertica
 99999

## 文字データを数値データに変換し失敗しています。

dbadmin=> select CAST(col1 as number) from moji_suji;
ERROR 3682:  Invalid input syntax for numeric: "Vertica"

変換可能なデータ型については、以下の記事をご覧ください。

 データ型の変換と変更
 https://www.ashisuto.co.jp/cm/analytics-database/changing_data_type.html

データ型の変換失敗時にデフォルト動作を変更する方法

データ型の変換に失敗した処理は、エラーが発生し処理が中断あるいはデータがNULLとして扱われます。失敗した処理をどのように扱うか、ユーザー側で制御することが可能です。データ型により制御できる動作が異なります。

項番

データ型

CAST関数失敗時のデフォルト動作

変更可能な動作

日付/時刻型

NULLとなる

エラー(ERROR 3679)を発生させる

リテラル

エラー(例:ERROR 3758)が発生する

変更不可

その他のデータ型

エラー(例:ERROR 3682)が発生する

NULLとして扱う

①日付/時刻型の場合

日付データへの変換に失敗した場合は、NULLとしてデータが扱われます。EnableStrictTimeCastsパラメータを1に設定することで、日付データの変換に失敗した処理にエラー(ERROR 3679)を発生させ、処理を中断させることが可能です。

## EnableStrictTimeCastsパラメータのデフォルトを確認します。

dbadmin=> SELECT current_value from configuration_parameters WHERE parameter_name ilike '%EnableStrictTimeCasts%';
  current_value
---------------
 0
(1 row)

## 日付データへの変換が失敗し、NULLとして扱われます。
 
dbadmin=> select CAST(col1 as date) from moji_suji;
 col1
------
         ★NULL として扱われています。
         ★NULL として扱われています。
(2 rows)

## EnableStrictTimeCastsパラメータを1に設定します。

dbadmin=>  ALTER SESSION SET EnableStrictTimeCasts=1;
ALTER SESSION

dbadmin=> SELECT current_value from configuration_parameters WHERE parameter_name ilike '%EnableStrictTimeCasts%';
 current_value
---------------
 1
(1 row)

## 日付データへの変換が失敗し、ERROR 3679 が発生します。

dbadmin=> select CAST(col1 as date) from moji_suji;
ERROR 3679:  Invalid input syntax for date: "99999"

パラメータの設定方法については、以下の記事をご覧ください。

 Verticaのパラメータ設定方法
 https://www.ashisuto.co.jp/cm/analytics-database/parameters_on_vertica.html

②リテラルの場合

リテラルの場合は、デフォルトのエラーを出力させる以外に動作を変更する方法はありません。

③その他のデータ型の場合

Verticaには、変換できないデータを無視するような関数や処理は存在しませんが、変換できないデータをNULLと扱う「::!」演算子があります。「::!」演算子を使用することで、データ変換に関するエラー(ERROR 3682)を発生させずに処理を継続できます。

## CAST関数で ERROR 3682 が発生します。

dbadmin=> select CAST(col1 as number) from moji_suji;
ERROR 3682:  Invalid input syntax for numeric: "Vertica"

## 「::!」演算子で変換できないデータをNULLとして扱います。

dbadmin=> select col1::!number from moji_suji;
 col1
-------
         ★NULL として扱われています。
 99999
(2 rows)

注意事項

「::!」演算子を使用したNULLとして扱う動作は、テーブル・データのみ有効です。リテラルで、「::!」演算子を使用した場合は、エラーが出力されます。

## 「::!」演算子を使用した場合はエラーが出力されます。

dbadmin=> select 'Vertica' ::! FLOAT;
ERROR 3757:  Invalid syntax for float: "Vertica"

参考情報

Data type coercion operators (CAST)
https://docs.vertica.com/12.0.x/en/sql-reference/language-elements/operators/data-type-coercion-operators-cast/

Cast failures
https://docs.vertica.com/12.0.x/en/sql-reference/language-elements/operators/data-type-coercion-operators-cast/cast-failures/

CAST演算子を使ったデータ型の明示的な変換
https://www.ashisuto.co.jp/cm/analytics-database/coercion_operators.html

検証バージョンについて

この記事の内容はVertica 12.0で確認しています。

更新履歴

2023/6/27 本記事を公開