В простейшем решении используется функция подстроки с регулярными выражениями . Надеюсь, ваша версия PostgreSQL их поддерживает.
SELECT adres,
substring(adres from '^.*?(?=[0-9]|$)') AS street,
substring(adres from '[0-9].*$') AS housenum
FROM mytable;
adres | street | housenum
-----------------+--------------+-----------------
some string 12 | some string | 12
another 2c | another | 2c
no number | no number |
99 first number | | 99 first number
withnumber1 234 | withnumber | 1 234
(5 rows)
Как указано в комментарии NullUserException , название улицы может содержать сам номер , который не следует считать номером дома. В этом случае я предполагаю, что «номер дома» может быть определен как подстрока, начинающаяся с цифры, перед которой ставится пробел.
Регулярные выражения в этом случае выглядят так:
SELECT adres,
substring(adres from '^.*?(?=\\s[0-9]|$)') AS street,
substring(adres from '\\s([0-9].*)$') AS housenum
FROM mytable;
Примеры будут разбиты по-разному:
adres | street | housenum
-----------------+-----------------+-----------
some string 12 | some string | 12
another 2c | another | 2c
no number | no number |
99 first number | 99 first number |
withnumber1 234 | withnumber1 | 234
(5 rows)