Попробуйте это:
(Заимствование из https://xzilla.net/blog/2006/Dec/sql-servers-charindex-function-in-postgresql.html и ответ Росса Прессора на Преобразовать дробную строку в десятичную для SQL Server)
create or replace function charindex(text, text, integer) returns integer as $$
begin
return
case
when strpos(substr($2, $3 + 1), $1) = 0
then 0
else strpos(substr($2, $3+1), $1) + $3
end;
end;
$$ language plpgsql;
create or replace function fraction_to_decimal ( frac varchar(100) ) returns decimal as $$
begin
return case
when frac like '% %/%'
then cast(left(frac, charindex(' ', frac, 1) -1) as decimal) +
( cast(substring(frac, charindex(' ', frac, 1) + 1, charindex('/', frac, 1)-charindex(' ',frac,1)-1) as decimal)
/ cast(right(frac, length(frac) - charindex('/', frac, 1)) as decimal) )
when frac like '%/%'
then cast(left(frac, charindex('/', frac, 1) - 1) as decimal) / cast(right(frac, length(frac) - charindex('/', frac, 1)) as decimal)
else
cast(frac as decimal)
end;
end;
$$ language plpgsql;
Тогда: SELECT fraction_to_decimal('1/2');
Также отлично работает для нулей: SELECT fraction_to_decimal(null)
;