Я думаю, что это то, что вы хотите:
SELECT str,
nullif(regexp_replace(str, '(-?[0-9]*\.?[0-9]*) ([^[:digit:]]*)$', '\1'), str) as num,
nullif(regexp_replace(str, '(-?[0-9]*\.?[0-9]*) ([^[:digit:]]*)$', '\2'), str) as unit
FROM smpl;
nullif()
обрабатывает ситуацию, когда ничто не соответствует - возвращает NULL
вместо полной строки.
Здесь - это дБ <> скрипка.