powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Парсинг строки
6 сообщений из 6, страница 1 из 1
Парсинг строки
    #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
Парсинг строки
    #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
Парсинг строки
    #38145740
Sankin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если в конце строки будет запятая, то будет неверное значение.
...
Рейтинг: 0 / 0
Парсинг строки
    #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
Парсинг строки
    #38145833
Sankin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо.
Но главный вопрос, почему не работает мой вариант.
Почему неправильно считается количество подстрок между запятыми?
...
Рейтинг: 0 / 0
Парсинг строки
    #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
6 сообщений из 6, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Парсинг строки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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