2016-09-06 15 views
0

他の行の値に基づいて、特定の列が空の行を更新する方法が不思議です。postgres - 他の行に基づいて行を更新する

enter image description here

Iは、以下の2行の値と最初の行の列(USER_NAME、データベース名、connection_from)を更新します。 session_idは同じです。

ありがとうございました。

+0

、ではない:私はあなたがsession_idに基づいてデータを見ていると、すべての非NULL値は、これらの3つの列のために働くだろうと仮定しましょう更新そのもの。必要なデータを選択する方法を理解していれば、UPDATEは簡単です。テーブル定義(特に主キー)の詳細を知らなくても、私はより具体的にすることはできません。 ところで、接続情報をconnection_ip inetおよびconnection_port intとして保存することを検討する必要があります。 inet型には強力な演算子がいくつかあります。 –

答えて

0

更新する値をどのように選択するかは、むしろ曖昧です。これの重要な部分は、あなたが収集しようとしているデータを理解することである

update t 
    set user_name = coalesce(t.user_name, tt.user_name), 
     database_name = coalesce(t.database_name, tt.database_name), 
     connection_from = coalesce(t.connection_from, tt.connection_from) 
    from (select session_id, max(user_name) as user_name, 
       max(database_name) as database_name, 
       max(connection_from) as connection_from 
      from t 
      group by session_id 
     ) tt 
    where t.session_id = tt.session_id and 
      (t.user_name is null or t.database_name is null or t.connection_from is null); 
+0

ありがとうございます。ほとんど働いた。 connection_from列は更新されませんでした。小さなキャッチ。 connection_from列はNULLのように見えますが、select *を発行するときはconnection_fromがnullで、行は返されません。私を導くことができますか?再度、感謝します。 – vignesh28

+0

@ vignesh28。 。 。 'coalesce()'を 'case。t.connection_from> ''のように置き換え、次にt.connection_from else tt.connection_from end)'と置き換えます。 –

関連する問題