postgres array_to_stringとarrayの使い方説明


三つの表があります。それぞれ以下の通りです。

select * from vehicle

select * from station

select * from vehicle_station

必要:
vehicleとstationは多対多の関係を表しています。vehicle表に対応するstation表の第二のフィールドを調べて一つのフィールドに置く必要があります。
ソリューション:

SELECT v.*, array_to_string(ARRAY (SELECT station_name FROM station WHERE ID IN (SELECT station_id FROM vehicle_station WHERE vehicle_id = v. ID)),',') station_names FROM vehicle v
結果は以下の通りです

補足:Postgres array配列タイプ詳細使用
デ兄さんのこの文章はよく書けています。相関関数の部分で、特にarray_up per、array_パワー部分には、自分なりの解釈があります。
ARRAYタイプはいくつかの重要な特徴を含んでいます。
次元
つまり何次元配列です。いくら値を付けても、ARRAYは最終的に行列でなければなりません。
例1:
ARRAY[1,2,3,4]は一次元配列であり、
ARRAY[[1,2],[3,4],[5,6]は二次元配列である。
例2:
ARRAY['digoal','zhoo'],['a','b',c']は間違っています。第二次元の中で最初のarrayは2つの要素がありますが、第二のarrayは3つの要素があります。行列ではなく、個数が一致していなければなりません。
同時にタイプも一致しなければなりません。
例3:
ARRAY['digoal','zhoo'],[1,2]]はエラーです。['digoal','zhou']はtext[]タイプですが、[1,2]はintタイプです。
元素
一次元配列ARRAY[1,2,3,4]の4つの要素はそれぞれ1,2,3,4.これらのint型の値です。
二次元配列ARRAY[[1,2],[3,4],[5,6]]の第一次元はARRAY[1,2],ARRAY[3,4],ARRAY[5,6]タイプの値が3つあります。第二次元の最初のsubscriptの要素は2つあります。それぞれ1,2,第二のscriptは5.bscript 6です。
要素間のセパレータは、ボックスタイプを除いてセミコロンです。他の種類の区切りはカンマです。
拡張性
一次元配列は拡張できますが、二次元配列は拡張できません。subscriptARRAYの要素にアクセスするにはsubscript値を提供する必要があります。デフォルトでは1から番号を付けます。値を指定するときはsubscriptを強制的に指定しないといけません。
例1:

ARRAY[[1,2],[3,4],[5,6]] as a
a[1][1] = 1;
a[1][2] = 2;
a[2][1] = 3;
a[2][2] = 4;
a[3][1] = 5;
a[3][2] = 6;
a最初の[]は第一次元を表し、中の数字は第一次元で訪問するsubscriptを表し、
a第二の[]は第二次元を表し、中の数字は第二次元で訪問するsubscriptを表し、
またARRAYのsliceにもアクセスできます。
例2:

a[1:2][1:1] = {{1},{3}}
最初の[]の1は下位subscriptを表し、2は高位subscript値を表します。
二番目の[]の左側の1は下位subscriptを表し、右側の1は上位subscript値を表します。

a[2:3][1:2] = {{3,4},{5,6}}
スペルの別の書き方は、一つの次元がスペルの書き方をしている限り、他の次元がスペルの書き方をしていない場合、デフォルトは高位と見なされます。
a[2:3][2]はa[2:3][1:2]に等しい。
次にARRAYタイプのいくつかの常用関数について説明します。
アラリdimsは、各次元の低ビットsubscriptと高位subscriptを返します。以下の通りです。

digoal=> select array_dims(ARRAY[[1,2,3,4,5],[6,7,8,9,10]]);
 array_dims 
---------+--
 [1:2][1:5]
アラリlengthは、arrayで指定された次元の長さまたは要素の個数を返します。

digoal=> select array_length(ARRAY[[1,2,3,4,5],[6,7,8,9,10]], 1);
 array_length 
-------+------
      2
digoal=> select array_length(ARRAY[[1,2,3,4,5],[6,7,8,9,10]], 2);
 array_length 
--------+-----
      5
注意:array_lowerとarray_ページの戻り値はすべて下付きで、デフォルトは1から下付きです。
アラリlowerは、ARRAYで指定された次元の低ビットsubscript値を返します。以下の通りです。

digoal=> select array_lower(ARRAY[[1,2,3,4,5],[6,7,8,9,10]], 2);
 array_lower 
--------+----
      1
以下は強制的にsubscript値を指定します。

digoal=> select array_lower('[-3:-2]={1,2}'::int[], 1);
 array_lower 
---------+----
     -3
アラリup perは、ARRAYで次元を指定する上位のsubscript値を返します。以下の通りです。

digoal=> select array_upper(ARRAY[[1,2,3,4,5],[6,7,8,9,10]], 2);
 array_upper 
--------+----
      5
以下は強制的にsubscript値を指定します。

digoal=> select array_upper('[-3:-2]={1,2}'::int[], 1);
 array_upper 
--------+----
     -2
アラリprependは、1次元配列の前面に要素を挿入するために使用され、以下の通りである。

digoal=> select array_prepend('digoal', ARRAY['francs','david']);
   array_prepend   
-------------------+---
 {digoal,francs,david}
array_append,               ,   
digoal=> select array_append(ARRAY['francs','david'], 'digoal');
   array_append   
---------------+-------
 {francs,david,digoal}
アラリcatは、同じ次元の2つの配列の接続、またはn次元配列とn+1次元配列との接続について、以下の通りである。

digoal=> select array_cat(ARRAY['francs'], ARRAY['digoal','david']);
    array_cat    
----------------+------
 {francs,digoal,david}
digoal=> select array_cat(ARRAY['francs'], ARRAY[['digoal']]);
   array_cat   
-----------------+---
 {{francs},{digoal}}
ゲナート_subscript sは、ARRAYの指定された次元に順番に戻るためのsubscript(s)の値を次のように返します。
最初の次元のsubscript値を返します。

digoal=> select generate_subscripts(a, 1) from (select ARRAY['a','b','c','d'] as a) t;
 generate_subscripts 
---------------+-----
          1
          2
          3
          4
第一次元のsubscript値を逆に返します。

digoal=> select generate_subscripts(a, 1, true) from (select ARRAY['a','b','c','d'] as a) t;
 generate_subscripts 
-----------------+--
          4
          3
          2
          1
digoal=> select generate_subscripts(a, 1) from (select '[-5:-1]={1,2,3,4,5}'::int[] as a) t;
 generate_subscripts 
---------------+-----
         -5
         -4
         -3
         -2
         -1
digoal=> select generate_subscripts(a, 1, true) from (select '[-5:-1]={1,2,3,4,5}'::int[] as a) t;
 generate_subscripts 
---------------+-----
         -1
         -2
         -3
         -4
         -5
多次元配列の第二次元、

digoal=> select generate_subscripts(a, 2) from (select '[-5:-4][2:4]={{1,2,3},{4,5,6}}'::int[] as a) t;
 generate_subscripts 
---------------+-----
          2
          3
          4
次にARRAYタイプの操作子について説明します。

digoal=> select typname,oid from pg_type where typname='anyarray';
 typname | oid 
----------+------
 anyarray | 2277
操作子は以下の通りです

digoal=> select oprname,oprleft,oprright,oprresult,oprcode,oprrest,oprjoin from pg_operator where oprleft=2277 or oprright=2277;
 oprname | oprleft | oprright | oprresult |  oprcode   |  oprrest  |   oprjoin   
---------+---------+----------+-----------+----------------+-------------+-----------------
 ||   |  2277 |   2283 |   2277 | array_append  | -      | -
 ||   |  2283 |   2277 |   2277 | array_prepend | -      | -
 ||   |  2277 |   2277 |   2277 | array_cat   | -      | -
 =    |  2277 |   2277 |    16 | array_eq    | eqsel    | eqjoinsel
 <>   |  2277 |   2277 |    16 | array_ne    | neqsel   | neqjoinsel
 <    |  2277 |   2277 |    16 | array_lt    | scalarltsel | scalarltjoinsel
 >    |  2277 |   2277 |    16 | array_gt    | scalargtsel | scalargtjoinsel
 <=   |  2277 |   2277 |    16 | array_le    | scalarltsel | scalarltjoinsel
 >=   |  2277 |   2277 |    16 | array_ge    | scalargtsel | scalargtjoinsel
 &&   |  2277 |   2277 |    16 | arrayoverlap  | areasel   | areajoinsel
 @>   |  2277 |   2277 |    16 | arraycontains | contsel   | contjoinsel
 <@   |  2277 |   2277 |    16 | arraycontained | contsel   | contjoinsel
(12 rows)
【注意】
-PostgreSQLではARRAYタイプの次元には制限がありません。int[]のように一次元配列だけを記憶することができるという意味ではなく、任意の次元のARRAY値を格納することができます。
-PostgreSQLでは、ARRAYタイプの要素の個数に対しても制限がありません。int[10]のように、10個の要素しか保存できないという意味ではありません。超過できます。
たとえば:

digoal=> create table array_test (id int[2]);
CREATE TABLE
digoal=> insert into array_test values (ARRAY[[1,2,3,4,5],[6,7,8,9,10]]);
INSERT 0 1
この例では要素の個数と次元は、int[2]の制限を超えていますが、エラーが発生しておらず、データが格納されています。

digoal=> select * from array_test ;
       id       
---------------------+------
 {{1,2,3,4,5},{6,7,8,9,10}}
マニュアルの説明は以下の通りです。
However,the current implemention ignores any supplied array size limits,i.e.the behavior is the same as for arrays of unspecified length.
The TAcurrent implemenation does not enforce the declead number of dimensions einther.Arays of a particular element type are all consided to be of the same type,regardless of sizor number of dimensinsionsionsionsionsionsionsionsion.Sorer.Somedersit does not affect run-time behavior.
以上は個人の経験ですので、参考にしていただければと思います。間違いがあったり、完全に考えていないところがあれば、教えてください。