PostgreSQLは CREATE TABLE AS SELECT (CTAS)をサポートしています。 行全体を表すことができる複合型 もサポートします。
これがCTASの例です。
CREATE TABLE foo AS
SELECT * FROM ( VALUES (1), (2) );
これは、行をSELECT
するいくつかの例です。
SELECT (1,2);
SELECT ROW(1,2);
SELECT t FROM ( VALUES (1,2), (2,100) ) AS t;
SELECT x FROM ( VALUES ((1,2)), ((2,100)) ) AS f(x);
SELECT (x,y) FROM ( VALUES (1,2), (2,100) ) AS t(x,y);
ただし、CTASでは機能しないようです。
CREATE TABLE foo AS SELECT f FROM ( VALUES (1,2), (2,100) ) AS f(x,y);
ERROR: column "f" has pseudo-type record
CREATE TABLE foo AS SELECT (x,y) FROM ( VALUES (1,2), (2,100) ) AS f(x,y);
ERROR: column "row" has pseudo-type record
これは入力エラーだと思いますが、CTASにはどのような構文が必要ですか?
私の理解が 「疑似型を列のデータ型として使用できない」 が正しければ、あなたがしようとしている方法でそれを行うことはできないと思います。
ただし、同様のことができます。
まず、複合型を定義します(たとえば、フィールドx
とy
を持つ「2次元のポイント」があります)。
-- Need to define the composite type
CREATE TYPE point_2d AS
(
x real,
y real
) ;
次に、point_2d
にキャストする必要のある「リテラル」を記述して、PostgreSQLが正確なタイプを認識できるようにします。したがって、これは機能します。
CREATE TABLE
ttt AS
SELECT
*
FROM
(
VALUES
('(1.5, 2.5)'::point_2d, '(-1.3, -2.2)'::point_2d),
('(2.3, 4.4)'::point_2d, '(-2.2, -3.3)'::point_2d)
) AS lines (start_point, end_point) ;
次に、次のようなクエリを実行できます。
SELECT
(start_point).x AS x_start,
(start_point).y AS y_start,
(end_point).x AS x_end,
(end_point).y AS y_end
FROM
ttt ;