22

どうすれば挿入できarray of enumsますか?
これが私のものenumです:

CREATE TYPE equipment AS ENUM ('projector','PAsystem','safe','PC','phone');

次に、私のテーブルには一連の機器があります。

CREATE TABLE lecture_room (
   id INTEGER DEFAULT NEXTVAL('lecture_id_seq')
 , seatCount int
 , equipment equipment[]
) INHERITS(venue);

これが私のINSERTへの試みです:

INSERT INTO lecture_room (building_code, floorNo,  roomNo, length, width
                        , seatCount, equipment) 
VALUES 
('IT', 4, 2, 10, 15 ,120, ARRAY['projector','PAsystem','safe']),

しかし、それは私に次のエラーを与えます:

ERROR: column "equipment" is of type equipment[] but expression is of type text[]
SQL state: 42804
Hint: You will need to rewrite or cast the expression.
4

4 に答える 4

30

textPostgreSQL は、 typeの入力を type の入力に自動的にキャストする方法を知りませんequipment。文字列を type として明示的に宣言する必要がありますequipment

ARRAY['projector','PAsystem','safe']::equipment[]

これをSQL Fiddleで確認しました。

于 2013-08-14T15:00:06.500 に答える
18

正しく提供された @Mark のようなARRAY コンストラクター に代わる方法は、文字列リテラルを使用することです。

'{projector,PAsystem,safe}'::equipment[]  -- cast optional

このバリアントは短く、一部のクライアントは、関数のような要素である ARRAY コンストラクターに問題があります。

さらに、このコンテキストではキャストはオプションです(よりクリーンなコードと読みやすさのため)。リテラルは最初は不明な型なので(ARRAY コンストラクターの結果とは異なります!)、Postgres はターゲット列から型を派生させ、すべてが機能します。

Postgres 9.3 以降でテスト済みです。

ここでdb <>フィドル -Postgres 14

ここでdb<>fiddle - Postgres 9.5

sqlfiddle - Postgres 9.3

于 2013-08-14T17:06:22.887 に答える
13

@harm の回答に加えて、引用符をスキップできます。

INSERT INTO lecture_room (equipment) VALUES ('{projector, safe}');
于 2018-07-05T13:19:46.657 に答える