Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Парсинг строки / 6 сообщений из 6, страница 1 из 1
11.02.2013, 11:26
    #38145669
Sankin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки
Здравствуйте,
Нужно в строке вида num1,num2,num3 ...., numN (где num - число) подсчитать количество чисел.
Написал такую функцию
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
create function win.fnGetCount(str varchar(512))
RETURNS INTEGER
Begin  atomic

DECLARE b INTEGER;
declare	e INTEGER;
declare	last INTEGER;
declare count INTEGER;
declare	value VARCHAR(128);

   set e = 1;
   set last = 0;
   set count = 0;
	
   while last = 0 do  
     set b = e;     
     set e = b +locate(',', substr(str,b,length(str)+1),b)-1;
       if e < b then
	  	 set last = 1;
         set e = length(strTrain);
	  end if;
      set value = rtrim(ltrim(substr(str, b,e-b)));
      if value != '' then 
	  	 set count = count+1;
	end if;
   END WHILE;
   return count;
   end


Но в результате получаю неверное значение.
В чем ошибка? Помогите пожалуйста.
...
Рейтинг: 0 / 0
11.02.2013, 11:43
    #38145700
m72
m72
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки
Sankin, если структура строки именно такая, то для подсчета запятых функции не надо

Код: sql
1.
2.
3.
4.
5.
6.
7.
with t1 (st) as (values '12,400,9999,3') 
select case when length(st) = 0 
then 0 
else 
1+length(replace(translate(st,'','1234567890'),' ','')) 
end 
from t1
...
Рейтинг: 0 / 0
11.02.2013, 11:56
    #38145740
Sankin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки
А если в конце строки будет запятая, то будет неверное значение.
...
Рейтинг: 0 / 0
11.02.2013, 12:18
    #38145791
m72
m72
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки
Sankin,

with
t1(st) as (values 'aa,ss,dd,ff,'),
t2(lng) as (select length(st) from t1),
t3(lst) as (select substr(st,lng,1) from t1,t2),
t4(st2) as (select case when lst=',' then substr(st,1,lng-1) else st end from t1,t2,t3)
select * from t4 -- далее аналогично предыдущему варианту --

p.s. предвосхищая ответ, предупреждаю "если в конце будет 2 запятых, точка с запятой и т.п. то работать не будет"
...
Рейтинг: 0 / 0
11.02.2013, 12:34
    #38145833
Sankin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки
Спасибо.
Но главный вопрос, почему не работает мой вариант.
Почему неправильно считается количество подстрок между запятыми?
...
Рейтинг: 0 / 0
11.02.2013, 15:22
    #38146215
mm2
mm2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки
Sankin,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
begin atomic
declare st varchar(128);
declare subst varchar(128);
declare ch char(1);
declare	pos integer;
declare cnt integer;
	set st = '12,403,9,8765,10,,,,40,';
	set ch = ',';
   	set cnt = 0;
   	while (length(st) > 0) do
   		set pos = locate(ch, st);
   		if pos > 0 then  
   			set subst = substr(st,1,pos-1);
   			set st = substr(st, pos+1, length(st) - pos + 1);
   		else 
   			set subst = st;
   		  	set st = '';
   		end if;
   		if length(trim(subst)) > 0 then
   			set cnt = cnt + 1;
   		end if;
   	end while;
   	--return 6
end@
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Парсинг строки / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]