Преобразовать дробную строку в число с плавающей точкой - PullRequest
0 голосов
/ 11 июня 2018

Мы пытаемся преобразовать в PostgreSQL что-то вроде этого:

select '1/2'::float;

ERROR:  invalid input syntax for type double precision: "1/2"
LINE 1: select '1/2'::float;

И на самом деле это работает:

select 1/2::float;
  ?column? 
----------
    0.5

Мы что-то упустили?Мы попробовали to_number ... Единственное решение, которое мы получили, это использовать split ...

Ответы [ 2 ]

0 голосов
/ 12 августа 2019

Попробуйте это:

(Заимствование из 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);

0 голосов
/ 11 июня 2018

Мы что-то упустили?

Да, вы.

1/2::float означает «значение 1, деленное на значение 2, приведенное как число с плавающей запятой».

'1/2'::float означает: приведите строку '1/2' к значению с плавающей запятой, но символ / недопустим для числовой константы.

Допустимое число в SQL состоит из цифры 0-9 в виде точки . для десятичного разделителя и, необязательно, e для обозначения экспоненциальных значений (например, 1e6 для «одного миллиона»).Так что '1/2'::float неверно так же, как '1(2'::float или '1 divided by 2'::float


И прежде чем вы попросите функцию, которая сделает это для вас, посмотрите следующие вопросы для универсального "eval () "function:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...