2016-11-26 5 views
3

PostgreSQLを学びたいと思っているときに問題が発生しています。 personという名前のリレーショナルオブジェクトを作成した後、プライマリ整数キーとpersonオブジェクトの配列からなるテーブルを作成しました。私は、この配列に行を挿入する方法だと感じていますが、オブジェクトの特定の列にもアクセスする方法がわかりません(例person.name)。PostgreSQLはユーザ定義オブジェクトの配列に挿入して選択します

現在のところ、行を挿入できる唯一の方法は次のとおりですが、私はそれが正しい人物オブジェクトの代わりに文字列オブジェクトを作成している可能性があると考えています。

INSERT INTO towns VALUES (0, '{"(bob,blue,springfield,33)"}'); 

参考のために私が作成したスキーマは次のとおりです。あなたがここに2つのこと、複合型personarrayとしてフィールドタイプを組み合わせている

CREATE TYPE person AS (
    name text, 
    favorite_color text, 
    hometown text, 
    age integer 
); 

CREATE TABLE towns (
    town_id integer PRIMARY KEY, 
    people person[] 
); 

答えて

0

ROWキーワードは、あなたの場合には、'{val1,val2}'のように、単一引用符内のブラケットを使用する必要があり、配列型の場合は

オプションである、あなただけの1を追加していることに注意してください、あなたはこのROW("bob","blue","springfield",33)ような何かを行う必要がある複合型を挿入するには要素はarrayであり、結果はpersonです。二重引用符ではなく、オブジェクト全体のために、personタイプ内部値のためであること

INSERT INTO towns VALUES (0, '{ROW("bob","blue","springfield",33)}'); 

注:

あなたの例は次のようになります。

参考文献:Composite TypesArrays

人の値にアクセスするには、あなたが()objectをラップする必要があり、そう(person).name

+0

Gotcha、私は引用符とシングルクォートの解散感謝します!私はこの例を実行しようとしましたが、 '不正な配列リテラル:" {ROW( "bob"、 "blue"、 "springfield"、33)} "というエラーが発生しました。私はあなたがより完全に投稿したドキュメントを読んだ後に、複合型のインスタンスだけのテーブルを使っていくつかのテストを行いました。コンポジットタイプに挿入するためにあなたが言及した構造で、コンポジットフィールドにアクセスするためにフィールドをラップすると、完全に機能します! – Jdeggs

+0

配列は二重ではなく一重引用符で囲む必要があることに注意してください – phobia82

0

私は仕事にこれを得ることができる唯一の方法は、次のように挿入していました:

INSERT INTO towns VALUES (0, (array[ROW('bob','blue','springfield',33)::person])); 

そして、あなたがこれを行うに必要があります選択する:

select (people[1]).age from towns; 
0

これは'{...}'よりもarray[...]の構文が好きな理由の1つです。あなたは入れ子に引用符を考える必要はありません。

INSERT INTO towns (town_id, people) 
    VALUES 
(0, array[('bob','blue','springfield',33)::person]); 

('bob','blue','springfield',33)::personは、単一の要素の配列ということになり種類personarray[...]のレコードを作成します。この作業を行うには、(...)で作成された匿名レコードを人にキャストする必要があります。あなたは配列に複数の人物のレコードを挿入したい場合には、最後に配列全体を小文字にするビット少ないタイピングです:

array[('bob','blue','springfield',33), ('arthur','red','sleepytown',42)]::person[] 

配列のレコードの特定の要素を選択するには、例えばを使用することができます

select town_id, people[1].name 
from towns 
関連する問題