Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Работаем со строками :) (число прочтений - 1773 )
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Работаем со строками :)
30. Октября 2007 :: 19:03
Печать  
Интересная задачка, требуется найти максимально длинный общий фрагмент (слева) номеров документов (текстовые) ОДНИМ запросом (можно конечно выполнять для разных длин) и без врем. таблиц и курсоров (ну или по желанию, тоже интересно)
Например есть доки 12345, 12356, 12377 - требуется получить 123
Сделал так по-быстрому, не нашел что-то функции:

Код
Выбрать все
Процедура УстановитьОбщийНомер()
	ТекстЗапроса = "
	|select max(j.docno)	МаксНомерДок
	|,	min(j.docno)		МинНомерДок
	|from zayavki as z (nolock)
	|left join _1sjourn as j (nolock) on z.iddoc = j.iddoc
	|where etap = 3
	|and z.iddoc not in (select distinct iddoc from zayavki (nolock) where etap > 3)
	|and pechskl = 1
	|";

	ТЗ = RecordSet.ВыполнитьИнструкцию(ТекстЗапроса);
	ТЗ.ВыбратьСтроку();

	Попытка
		МаксНомер	= ТЗ.ПолучитьЗначение(1, "МаксНомерДок");
		МинНомер	= ТЗ.ПолучитьЗначение(1, "МинНомерДок");
	Исключение
		Возврат;
	КонецПопытки;

	Длина = Мин(СтрДлина(МаксНомер), СтрДлина(МинНомер));

	Для Сч = 1 по Длина Цикл
		Если Сред(МаксНомер,Сч,1) <> Сред(МинНомер,Сч,1) Тогда
			Поз = Сч - 1;
			Прервать;
		КонецЕсли;
	КонецЦикла;

	НомерЗаявки = Лев(МаксНомер, Поз);
КонецПроцедуры
 




  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Rubin
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 70
Зарегистрирован: 31. Июля 2007
Re: Работаем со строками :)
Ответ #1 - 31. Октября 2007 :: 14:53
Печать  
можно наверно так, если я правильно понял идею, только с типами не знаю что... Озадачен

Код
Выбрать все
CREATE FUNCTION dbo.Example(@s1 varchar(10), @s2 varchar(10))
RETURNS varchar(10)
BEGIN
	declare @a varchar(10)
	declare @i int

	set @i = 0
	while (substring(@s1,1,@i+1)=substring(@s2,1,@i+1)) and (@i<=len(@s1) or @i<len(@s2)) begin
		set @i = @i + 1
	end
	set @a = substring(@s1,1,@i)
RETURN @a
END 

           

Код
Выбрать все
select dbo.Example(max(j.docno),min(j.docno))
from zayavki as z (nolock)
left join _1sjourn as j (nolock) on z.iddoc = j.iddoc
where etap = 3
and z.iddoc not in (select distinct iddoc from zayavki (nolock) where etap > 3)
and pechskl = 1 



Или в особо извращённой форме.. ггг
Код
Выбрать все
	SELECT
		MAX(CONVERT(int, CASE WHEN RowN=1 THEN
			CASE WHEN tmp.str6 LIKE tmp.str1+'%' THEN tmp.str1 END
		ELSE CASE WHEN RowN=2 THEN
			CASE WHEN tmp.str6 LIKE tmp.str2+'%' THEN tmp.str2 END
		ELSE CASE WHEN RowN=3 THEN
			CASE WHEN tmp.str6 LIKE tmp.str3+'%' THEN tmp.str3 END
		ELSE CASE WHEN RowN=4 THEN
			CASE WHEN tmp.str6 LIKE tmp.str4+'%' THEN tmp.str4 END
		ELSE CASE WHEN RowN=5 THEN
			CASE WHEN tmp.str6 LIKE tmp.str5+'%' THEN tmp.str5 END
		END END END END END)) as str
	FROM (
		SELECT
			LEFT(val.a,1) as str1,
			LEFT(val.a,2) as str2,
			LEFT(val.a,3) as str3,
			LEFT(val.a,4) as str4,
			LEFT(val.a,5) as str5,
			val.b as str6,
			RowNs.RowN
		FROM (
			select max(j.docno)	as a
			,	min(j.docno) as b
			from zayavki as z (nolock)
			left join _1sjourn as j (nolock) on z.iddoc = j.iddoc
			where etap = 3
			and z.iddoc not in (select distinct iddoc from zayavki (nolock) where etap > 3)
			and pechskl = 1
		) as val,
		(
			SELECT 1 as RowN
			 UNION ALL SELECT 2
			 UNION ALL SELECT 3
			 UNION ALL SELECT 4
			 UNION ALL SELECT 5
		) as RowNs
	) as tmp 


Захотелось проверить свои зелёные познания на профпригодность.. катит?
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Работаем со строками :)
Ответ #2 - 31. Октября 2007 :: 17:42
Печать  
Нормалек, спасибо Улыбка
С функцией несколько неожиданно, но по сути это то же самое что у меня Улыбка
Показалось что должно что-то быть простое, только не смог найти или додуматься
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Работаем со строками :)
Ответ #3 - 01. Ноября 2007 :: 16:54
Печать  
Корректировочка к моему коду, добавить надо одну строку, забыл:

Код
Выбрать все
Длина	= Мин(СтрДлина(МаксНомер), СтрДлина(МинНомер));
Поз	= Длина;
 

  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать