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

Teradata Vantage™ - SQLデータ操作言語

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
Published
2021年1月
Language
日本語
Last Update
2021-03-30
dita:mapPath
ja-JP/vnq1596660420420.ditamap
dita:ditavalPath
ja-JP/vnq1596660420420.ditaval
dita:id
B035-1146
Product Category
Software
Teradata Vantage

集合演算子の結果によって、操作中に最初の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)