Сам вопрос
Есть таблица, в которой хранятся формулы, например (([A]+[B])/[C]-[D])*1,5
В другой таблице есть уникальные записи с такими аббревиатурами и числовыми значениям.
Нужно подставить значения и вычислить получившееся выражение.
Предложите нилучший способ это сделать.
Мой вариант
Я сделал, но как-то мне кажется не очень эффективно и у меня есть места, где вообще кое-что не получилось. Хочется узнать ваши мысли по вопросу.
Делал следующим образом.
1)строку с формулой "(([A]+[B])/[C]-[D])*1,5" приводил к такому виду "A;B;C;D" при помощи функции regexp_replace. На самом деле щас к такому виду могу привести тока формулу попроще, например, [A]/[B]+[C], т.е. через один знак между аргументами. regexp_replace('формула','\\[.\\]',';','g'). Рахзобраться с шаблонами, чтобы вырезать все что между скобками [] через ; так и не удалось. Тут нужна помощь.
2)делал запрос к таблице со значениями, где выражение "A;B;C;D" при помощи функции regexp_split_to_table разделял на записи, и таким образом находил все необходимые значения.
3)после этого вместо аббревиатур выражения "(([A]+[B])/[C]-[D])*1,5" подставлял полученные значения опять же при помощи regexp_replace, удалял скобки [] и получалось выражение
4)вычислял полученное значение (тут тоже как-то не получается)
declare _expression varchar(1000); --тут результирующее выражение для вычисления после подстановки
_value numeric(20,2); --результат вычисления выражения
...
execute 'select $1'
into _value
using _expression
вобщем тут выдает ошибку (точно не могу написать, т.к. нет постгре под рукой) что выражение 9.00+4.54-1.63 не может быть записано в численную переменную _value.
По поводу скорости беспокоиться не нужно, так как в формуле максимум будет около 10 переменных значения которых необходимо получить и затем вычислить выражение. За раз нужно будет вычислить не больше сотни формул. Даже если это займет несколько минут, что врятли, не фатально. Операция редкая и выполняется по требованию.
Зарание благодарен за любое мнение.
Почему бы не воспользоваться
Почему бы не воспользоваться для написания нужной вам функциональности одним из языков высокого уровня, поддержка которого есть в PostgreSQL? Например plpgPerl или pgTcl? Мне кажется так намного проще будет.