リファレンスガイド> TDV SQLのキーワードと構文> SELECT(仮想列)
 
SELECT(仮想列)
TDVは、標準のSQL SELECTステートメントをサポートするだけでなく、ビューの投影リストでの「仮想列」の定義をサポートします。仮想列が宣言された後、リテラルを使用できる場所であればどこでもクエリで使用できます。
仮想列の主な用途は、クエリのFROM句に含まれるプロシージャです。ただし、WHERE、HAVING、およびJOINON句で仮想列を使用することもできます。それらをGROUPBY句とORDER BY句に含めることは許容されますが、効果はありません(リテラルのように)。
構文
{DECLARE columnName columnType [DEFAULT literalValue]}
 
仮想列は、次のようにSELECT句で宣言されます。
SELECT c1, {DECLARE columnNameA columnTypeA,
       c2, {DECLARE columnNameB columnTypeB DEFAULT xx} ...
備考
仮想列は修飾されていないため、それらの名前は一意であり、FROM句の項目の名前とは異なる必要があります。
たとえば、ColumnOneという名前の列を持つテーブルからFROMを選択した場合、仮想列の名前はColumnOneにしないでください。
仮想列を使用したクエリが実行されると、クエリエンジンは述語(WHERE句など)を分析してcolumnName =リテラル式を探します。これらの句はクエリから削除され、リテラルは?のように置き換えられます。 (疑問符)は、準備されたステートメントで置き換えられます。
たとえば、次のステートメント
SELECT * FROM V1 WHERE columnName = 99
 
になります。
SELECT T1.column1, 99, T1.column2
FROM /some/table T1, Procedure1 (5,99) P1, Procedure2 (concat(99,'abc')) P2
WHERE (99 > T1.column1) AND (T1.someKey = P2.someKey)
 
columnName = literalの使用は重要です。他のタイプの比較演算子では、値は設定されません。リテラルは、単一のリテラル、またはconcat( 'abc'、 'def')のような関数とリテラルのみを含む式にすることができます。
関係の最適化は仮想列に適用されます。これは、クエリにcolumnName = otherColumnがあり、otherColumn = 5の述語がある場合、クエリエンジンはcolumnName = 5も真であると判断し、それを設定することを意味します。
WHERE句に外部結合を使用すると、結合の内側に不正に適用される可能性があります。これが発生すると、クエリエンジンは置換を実行できなくなり、理解しやすい場合とそうでない場合があるエラーメッセージが表示されます。
仮想列にDEFAULT値が指定されていない場合は、列の値をWHERE句で指定する必要があります。そうしないと、エラーが発生します。
DEFAULT値が指定されている場合、WHERE句の設定が見つからない場合に使用されます。
仮想列が複数の値に設定されている場合、エラーが発生します。
次のSELECTステートメントは、ビューV1を定義します。
SELECT T1.column1, {DECLARE columnName INTEGER DEFAULT 50}, T1.column2
FROM /some/table T1, Procedure1 (5, columnName) P1, Procedure2 (concat(columnName,'abc')) P2
WHERE (columnName > T1.column1) AND (T1.someKey = P2.someKey)