16.20 - 例: UNIONのデータ型に対する明示NULLの影響 - Teradata Database - Teradata Vantage NewSQL Engine

Teradata Vantage™ SQLデータ操作言語

Product
Teradata Database
Teradata Vantage NewSQL Engine
Release Number
16.20
Release Date
2019年3月
Content Type
プログラミング リファレンス
Publication ID
B035-1146-162K-JPN
Language
日本語 (日本)

集合演算子の結果によって、操作中に最初のSELECT文で定義される列のデータ型が評価されます。最初のSELECT文にある列が明示NULLとして定義される場合、結果のデータ型は直感的には認識されません。

次に、直感的には同一結果を評価すると思われるが、そうではない2つの例を示します。

最初に、明示NULLが列値として選択されます。

   SELECT 'p', NULL
   FROM TableVM
   UNION
   SELECT 'q', 145.87
   FROM TableVM;

BTEQは以下の結果を戻します。

   'p'         Null
   ---  -----------
   p              ?
   q            145

Null列の第2行に対する予期値は、予期した値、つまり10進値145.87とは異なる可能性があります。

合併の2つのSELECTの順序が逆になると、

   SELECT 'q', 145.87
   FROM TableVM
   UNION
   SELECT 'p', NULL
   FROM TableVM;

BTEQは以下の結果を戻します。

   'q'       145.87
   ---  -----------
   p              ?
   q         145.87

qの値は、 真のデータ型(DECIMAL)として報告されます。このとき切り捨ては行なわれません。なぜ、この違いがあるのでしょう。

最初の合併の例では、明示NULLは最初のSELECT文の第2列に指定されます。第2SELECT文の第2列は、DECIMAL数として指定されますが、整数に評価します。これは、このコンテキスト内で、NULLは値を持ちませんが、データ型INTEGERを持ち、その型が合併の結果に保存されるからです。

第2の合併の例では、値145.87のデータ型(DECIMAL)が結果を指定します。

次のSELECT文を実行して、NULLおよび 145.87の変換されないデータ型を確認することができます。

   SELECT TYPE(NULL), TYPE(145.87)

BTEQは以下の結果を戻します。

   Type(Null)         Type(145.87)
   -----------------  ----------------------
   INTEGER            DECIMAL(5,2)