-- =============================================
-- Author:		Marat Zigangaraev
-- Create date: 19.11.2014
-- Description:	Проверка вхождения номера дома в указанные адреса (через запятую или диапозон)
--				Вызов из dbo.fn_ContainsHouse()
-- =============================================
DROP FUNCTION IF EXISTS dbo.fn_CheckAddress;
CREATE FUNCTION dbo.fn_CheckAddress(h varchar(128), hs varchar(128))
	RETURNS Boolean AS
 $$
	DECLARE	
	_idx Integer;
	_prev Integer; 
	_split varchar(128);
	_hs_len integer;
 Begin
	hs := lower(hs);
	if h is null then h := ''; end if;
	if hs is null then hs := ''; end if;

	_idx := strpos(hs, ',');
	_prev := 0;
	_hs_len := char_length(hs);
	WHILE 1 = 1 
	LOOP
		if _idx > 0
		then _split := substring(hs from _prev for (_idx - _prev));
		else _split := substring(hs from _prev for (_hs_len + 1 - _prev));
		end if;
		
		-- поиск включения и обработка ч/н
		if substring(_split from 1 for 1) = 'н'
		then
			if substring(_split from 2 for 1) = '(' 
			AND substring(_split from char_length(_split) for 1) = ')' 
			AND ISNUMERIC(h) = 't' -- явл-ся числом (исключаем 5а,7б и т.д.)
			AND fn_CheckHouse(h, substring(_split from 3 for (char_length(_split) - 3))) = '1' -- вход в диапазон
			AND h::int%2 = 1 -- нечетность
			then
				return '1';
			end if;
		elsif substring(_split from 1 for 1) = 'ч'
		then
			if substring(_split from 2 for 1) = '(' AND substring(_split from char_length(_split) for 1) = ')'
			AND ISNUMERIC(h) = 't' -- явл-ся числом (исключаем 5а,7б и т.д.)
			AND fn_CheckHouse(h, substring(_split from 3 for (char_length(_split) - 3))) = 1 -- вход в диапазон
			AND h::int%2 = 0 -- четность
			then
				return '1';
			end if;
		else
			if fn_CheckHouse(h, _split) = '1'
			then 
				return '1';
			end if;
		end if;

		if _idx = 0
			then exit;
		end if;

		-- переход к след.строке
		_prev := _idx + 1;
		--_idx := strpos(substring(hs from _prev for (_hs_len + 1 - _prev)),',');
		_idx := charindex(',', hs, _prev);
	END LOOP;
	
	return '0';    
END $$
language plpgsql immutable;