Mit regulären Ausdrücken könnte man sich der Sache durchaus nähern. Um der Überschrift zu genügen, und wirklich den ersten Eintrag zu extrahieren, sprich bis zum ersten Blank bei folgenden Testdaten abzuschneiden:
select str from kunde;
str
Am Weidenweg 49, 19434 Potsblitz
Löwenhardtdamm 17 10829 Berlin
In der Au 9 44332 Biesdorf
Haus Alpenglühn 88888 Bergdorf
SELECT regexp_replace (str, '([^ ]*) .*', E'\\1') as part1, regexp_replace (str, '[^ ]* (.*)', E'\\1') as part2 FROM kunde;
part1 | part2
----------------+-------------------------------
Am | Weidenweg 49, 19434 Potsblitz
Löwenhardtdamm | 17 10829 Berlin
In | der Au 9 44332 Biesdorf
Haus | Alpenglühn 88888 Bergdorf
Die Testdaten sind absichtlich etwas fies gewählt, aber in den Alpendörfern sind Häuser ohne Straßenname, wo es aber Hausnamen gibt, möglich. Dafür habe ich keine Mannheimer Straßen aufgeführt, da ich die dortigen Gepflogenheiten nicht kenne.
Eher würde ich aber versuchen vor der Postleitzahl zu trennen:
SELECT regexp_replace (str, '([^ ]*) [0-9]{5}.*', E'\\1') as part1, regexp_replace (str, '.* ([0-9]{5}.*)', E'\\1') as part2 FROM kunde;
part1 | part2
-------------------+-----------------
Am Weidenweg 49, | 19434 Potsblitz
Löwenhardtdamm 17 | 10829 Berlin
In der Au 9 | 44332 Biesdorf
Haus Alpenglühn | 88888 Bergdorf
HIer ist jetzt jeweils die Hausnummer Teil von Part 1, was sich noch ändern ließe, in dem man den Text vor der Postleitzahl mit auf die rechte Seite zieht.
Wenn die Schreibweisen für Hausnummern wie in 17-23, 4a usw. immer einheitlich wären wäre das wohl kein Problem, aber wenn manche Einträge wieder 17 - 23 oder 4 a lauteten, wäre auch entsprechend mehr nachzuarbeiten.