Пятница, господа ! Сложение чисел

dmidek
Дата: 26.05.2006 15:07:31
Добрый день !
Сегодня пятница и мне хочется предложить Вам на мой взгляд интересное задание, хотя "ничто не ново под луной".

Эта задачка взята с форума наших западных друзей.
Один тамошний программист хранил данные в 1 колонке типа VARCHAR2 в таком виде

COL1

+23+345+56
+456+689+23
+2

Зачем он развивал такой дизайн трудно сказать, но при попытке получить сумму чисел в строке, его ждало разочарование.
Отрицательных чисел нет, дробных нет, только целые с плюсами.

Здесь конечно решений много.
Гляньте, если не заняты.
Счастливо.

P.S. В конце дам ссылку, посмотрим кто покруче
pamir
Дата: 26.05.2006 15:10:50
Сумма должна вычислиться для одной, уже выбранной до этого строки? или это должен быть селект этой колонки из таблицы, но уже дающий сумму?
В общем - результат - выборка или одно значение?
aZm
Дата: 26.05.2006 15:11:57
скорее, с форума индусских проектировщиков :) это только тама я видел массовый отказ от 1й нф )

а вообще - я бы решал так: считаем колво плюсов в строке, выбираем из алл обжектс строки по кол-ву плюсов, подставляем сабстры. и потом тупо делаем sum.

инстанса под рукой щас нету, мб вечером попробую...

---
No Pity. No Mercy. No Regret.
dmidek
Дата: 26.05.2006 15:12:34
pamir
Сумма должна вычислиться для одной, уже выбранной до этого строки? или это должен быть селект этой колонки из таблицы, но уже дающий сумму?
В общем - результат - выборка или одно значение?

Это выборка. Надо посчитать сумму в каждой строке.
dmidek
Дата: 26.05.2006 15:13:49
aZm
скорее, с форума индусских проектировщиков :) это только тама я видел массовый отказ от 1й нф )


Тепло
Дождитесь ссылки.
pamir
Дата: 26.05.2006 15:14:04
dmidek
pamir
Сумма должна вычислиться для одной, уже выбранной до этого строки? или это должен быть селект этой колонки из таблицы, но уже дающий сумму?
В общем - результат - выборка или одно значение?

Это выборка. Надо посчитать сумму в каждой строке.

И конечно же не рекомендуется использовать PL/SQL (т.е. написать ф-цию)? Мог бы наверное и не спрашивать
dmidek
Дата: 26.05.2006 15:16:07
pamir
dmidek
pamir
Сумма должна вычислиться для одной, уже выбранной до этого строки? или это должен быть селект этой колонки из таблицы, но уже дающий сумму?
В общем - результат - выборка или одно значение?

Это выборка. Надо посчитать сумму в каждой строке.

И конечно же не рекомендуется использовать PL/SQL (т.е. написать ф-цию)? Мог бы наверное и не спрашивать

Нет , нет, совершенно напрасно. Никаких ограничений вообще нет !
Oldwalkman
Дата: 26.05.2006 15:20:35
Блин, а что мешает вызывать функцию, в которой стоит динамический SQL:

cmd := 'select '||string_from_table||' from dual;';

естественно, надо проверить на +/цифры, что бы избежать дефейса... ;)
pamir
Дата: 26.05.2006 15:22:54
dmidek
pamir
dmidek
pamir
Сумма должна вычислиться для одной, уже выбранной до этого строки? или это должен быть селект этой колонки из таблицы, но уже дающий сумму?
В общем - результат - выборка или одно значение?

Это выборка. Надо посчитать сумму в каждой строке.

И конечно же не рекомендуется использовать PL/SQL (т.е. написать ф-цию)? Мог бы наверное и не спрашивать

Нет , нет, совершенно напрасно. Никаких ограничений вообще нет !

Тогда решение в лоб
DECLARE
   l_param VARCHAR2(1000):= '+1+2+5'; -- 8
   l_res NUMBER;
   l_tmp VARCHAR2(1000);
BEGIN
  l_tmp:='0'||l_param;
  dbms_output.put_line(l_tmp);
  EXECUTE IMMEDIATE 'select '||l_tmp||' from dual' INTO l_res;
  dbms_output.put_line(l_res);
END;
Сделать из этого ф-цию не составит труда.
iV@n
Дата: 26.05.2006 15:23:29
первое что пришло в голову
create function str_sum (v in varchar2) return number is
 res number;
begin
  execute immediate 'select 0'||v||'from dual' into res;
  return res;
end str_sum;

SQL> select col||' = '||str_sum(col) from (
  2  select '+23+345+56' col from dual union all
  3  select '+456+689+23' from dual union all
  4  select '+2' from dual)
  5  /

COL||'='||STR_SUM(COL)
------------------------------------------------------
+23+345+56 = 424
+456+689+23 = 1168
+2 = 2