okay, zum letzten Mal heute.

Ich könnte doch zuerst alle Einträge mit leerem String ausfiltern.
Code:
 
SELECT gfrgebaeude_details.gfrgebaeude_details_value FROM gfrgebaeude_details WHERE gfrgebaeude_details.gfrgebaeude_details_value != '' AND gfrgebaeude_details.gfrgebaeude_details_value != '0' AND gfrgebaeude_details.gfrgebaeude_details_value != '-1'
Dann mit der alten Abfrage kombinieren.
kombiniert
Code:
SELECT gfo_partner.name, gfrgebaeude_details.gfrgebaeude_details_value from gfo_partner left join gfrgebaeude_details on (gfo_partner.kontaktnummer = regexp_replace(gfrgebaeude_details.gfrgebaeude_details_value,'[^0-9]','','g')::int);"
Code:
test=> SELECT gfo_partner.name, gfrgebaeude_details.gfrgebaeude_details_value from gfo_partner left join gfrgebaeude_details on (gfo_partner.kontaktnummer = regexp_replace((SELECT gfrgebaeude_details.gfrgebaeude_details_value FROM gfrgebaeude_details WHERE gfrgebaeude_details.gfrgebaeude_details_value != '' AND gfrgebaeude_details.gfrgebaeude_details_value != '0' AND gfrgebaeude_details.gfrgebaeude_details_value != '-1'),'[^0-9]','','g')::int);

ERROR:  more than one row returned by a subquery used as an expression
Das wäre, wenn es geht zwar nicht schön. Aber es würde reichen.