CREATE TABLE bobjohn
        ( ID INTEGER NOT NULL
        , zname varchar
        );
INSERT INTO bobjohn(id, zname) VALUES
 (1,'Bob') ,(1, NULL) ,(1, NULL)
,(2,'John') ,(2, NULL) ,(2, NULL)
        ;
UPDATE bobjohn dst
SET zname = src.zname
FROM bobjohn src
WHERE dst.id = src.id
AND dst.zname IS NULL
AND src.zname IS NOT NULL
        ;
SELECT * FROM bobjohn;
注:特定のIDに複数の名前が存在する場合、このクエリは失敗します。( null以外の名前が存在しないレコードには影響しません)
postgresバージョン>-9を使用している場合は、CTEを使用してソースタプルをフェッチできます(これはサブクエリと同等ですが、書き込みと読み取りが簡単です(IMHO)。CTEは重複する値にも取り組みます-問題(かなり大雑把な方法で):
        --
        -- CTE's dont work in update queries for Postgres version below 9
        --
WITH uniq AS (
        SELECT DISTINCT id
        -- if there are more than one names for a given Id: pick the lowest
        , min(zname) as zname
        FROM bobjohn
        WHERE zname IS NOT NULL
        GROUP BY id
        )
UPDATE bobjohn dst
SET zname = src.zname
FROM uniq src
WHERE dst.id = src.id
AND dst.zname IS NULL
        ;
SELECT * FROM bobjohn;