web-dev-qa-db-ja.com

複合型を使用してTABLEAS SELECT(CTAS)をどのように作成しますか?

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にはどのような構文が必要ですか?

2
Evan Carroll

私の理解が 「疑似型を列のデータ型として使用できない」 が正しければ、あなたがしようとしている方法でそれを行うことはできないと思います。

ただし、同様のことができます。

まず、複合型を定義します(たとえば、フィールドxyを持つ「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 ;
1
joanolo