2

次のようなテーブルがあります。

point_path_id     line_path_id     season_id     gps_time     heading     roll     pitch       geometry
    1                 ___             ___           ___         ___        ___      ___       PostGISGeom
    2                 ___             ___           ___         ___        ___      ___       PostGISGeom
    3                 ___             ___           ___         ___        ___      ___       PostGISGeom
    4                 ___             ___           ___         ___        ___      ___       PostGISGeom  
    5                 ___             ___           ___         ___        ___      ___       PostGISGeom       

また、PHP には、更新したい ID のリストと、line_path_id と season_id の値があります。gps_time、heading、roll、pitch の配列もあります。

次の SQL ステートメントがあります (PHP からのエコー)

UPDATE greenland.point_paths 

SET 

line_path_id=1,
season_id=2, 
gps_time=unnest(array[1303475178.0031,1303475178.0081,1303475179.0081,1303475180.0081,1303475181.0081]::double precision[]),
heading=unnest(array[-2.0819464,-2.0819407,-2.0820324,-2.08202,-2.0819855]::double precision[]),
roll=unnest(array[-0.007395,-0.007395,-0.0073832,-0.0073949,-0.0073853]::double precision[]),
pitch=unnest(array[-0.0246114,-0.0246115,-0.0246108,-0.024582,-0.0245905]::double precision[]) 

WHERE point_path_id IN (1,2,3,4,5);

これは挿入されていますが、正しくありません。配列の最初の値は、point_path_id の 5 つの ID すべてに挿入されます。私はテーブルに以下を取得します:

ここに画像の説明を入力

このネスト解除は、他の多くのステートメントでは正常に機能しますが、この形式では正しく機能しないようです。私の間違いはどこですか?

これより前に何が起こっているかについての背景は次のとおりです。データのJSON文字列がURLEAD(MATLAB)を介して送信され、PHPを介して多くのテーブルにデコード/挿入されます。

PostGIS ラインストリング GEOM が挿入され、その ID が返されます (line_path_id) シーズンが挿入され、その ID が返されます (season_id)

次に、ラインストリングが上記の表のポイントにダンプされ、シリアルの point_path_id が自動生成されて返されます。

次に、各ポイントに関連付けられたデータを挿入する必要があります(これが私がやろうとしていることです)

各ポイントの line_path_id、season_id、gps_time/heading/roll/pitch があります。時間/見出し/ロール/ピッチは、ポイント数の長さの配列になっています。

100,000 以上のポイントが存在する可能性がありますが、たとえば 5 でテストしてみましょう。

ポイントがダンプされた後、ここに再び表が表示されます。

point_path_id     line_path_id     season_id     gps_time     heading     roll     pitch       geometry
    1                 ___             ___           ___         ___        ___      ___       PostGISGeom
    2                 ___             ___           ___         ___        ___      ___       PostGISGeom
    3                 ___             ___           ___         ___        ___      ___       PostGISGeom
    4                 ___             ___           ___         ___        ___      ___       PostGISGeom  
    5                 ___             ___           ___         ___        ___      ___       PostGISGeom   

変数も 2 つあります。 $line_path_id = # $season_id = #

そして 4 つの配列 $gps_time = [#,#,#,#,#]; 見出し... ロール... ピッチ...

各ポイント ジオメトリに関連する値を挿入する必要があります。これが目標です。

これが最善の解決策を見つけるのに役立つことを願っています。

4

1 に答える 1

1

unnest() は集合を返す関数です。問題は、UPDATE ステートメントの各 SET 割り当てが、WHERE 句で見つかった各行のフィールドに割り当てる単一の値を探していることです。UPDATE は、最初の配列値が point_path_id=1 などの行に移動することを意図していることを知りません。

小さな配列の場合、クエリを次のように書き直すことができます。

UPDATE greenland.point_paths 
   SET line_path_id=1,
       season_id=2, 
       gps_time=(array[1303475178.0031,1303475178.0081,1303475179.0081,1303475180.0081,1303475181.0081])[point_path_id]::double precision[],
       heading=(array[-2.0819464,-2.0819407,-2.0820324,-2.08202,-2.0819855])[point_path_id]::double precision[],
       roll=(array[-0.007395,-0.007395,-0.0073832,-0.0073949,-0.0073853])[point_path_id]::double precision[],
       pitch=(array[-0.0246114,-0.0246115,-0.0246108,-0.024582,-0.0245905])[point_path_id]::double precision[]
 WHERE point_path_id IN (1,2,3,4,5);

それは、配列インデックスと一致する point_path_id に依存していますが。

このデータをシステムに取り込むには、おそらく別のアプローチが必要です。このテーブルで一度に 100,000 行を更新することが予想される場合は、おそらく COPY を使用して、point_path_id、season_id、line_path、gps_time、roll、pitch、それぞれを行ごとに単一の値。次に、次のことができます。

UPDATE greenland.points_path pp
   SET season_id=s.season_id,
       line_path=s.line_path,
       gps_time=s.gps_time,
       roll=s.roll,
       pitch=s.pitch,
       heading=s.heading
  FROM staging s
 WHERE pp.point_path_id=s.point_path_id
于 2013-02-19T04:14:56.100 に答える