select list declaration

 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

 このやり方は、データ型を制約できるが、列名に制約をかけられないので筋が悪い。
もう少し考えを練る必要あり。

コメントを残す