SQL で列リストを宣言する手段の提案について。
もしくは、列リストを継承する手段について。
SQL を言語としてみたとき、再利用を考慮するならインタフェースと実装は分離したい。
インタフェース宣言のやり方を、SQL のパターンとして考えてみる。
宣言
単純なクエリ SELECT * FROM TBL
の列リストが、COL1, COL2
であることを保証するには。
クエリの先頭に SELECT NULL AS COL1, NULL AS COL2 FROM DUAL WHERE 1=0
を付加する(DUAL 表がある場合)。
SELECT NULL AS COL1, NULL AS COL2 FROM DUAL WHERE 1=0 UNION ALL SELECT * FROM TBL
データ型までは制約したい場合、NULL の代わりに適当な即値を用いるか、既存の表・列を指定する。
SELECT 0 AS COL1, 'X' AS COL2 FROM DUAL WHERE 1=0 UNION ALL SELECT * FROM TBL
継承
列リストを完全に一致させる場合は上記でよいが、包含関係であることを保証したい場合もある。
いわゆる継承だ。
クエリの末尾に SELECT 0 AS COL1, 'X' AS COL2, NULL FROM DUAL WHERE 1=0
を付加する。
並びはクエリに合わせて、関連がない列はすべて NULL
を指定すること。
これらを複数付加することもできる。
SELECT * FROM TBL UNION ALL SELECT 0 AS COL1, 'X' COL2, NULL FROM DUAL WHERE 1=0 UNION ALL SELECT NULL, NULL, NOW() FROM DUAL WHERE 1=0
このやり方は、データ型を制約できるが、列名に制約をかけられないので筋が悪い。
もう少し考えを練る必要あり。