Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как упростить запрос  [new]
Kudep
Member

Откуда: From Russia
Сообщений: 146
Всем привет,
Есть такой страшный запрос
declare @T table (id int, [Type] varchar(10), Name varchar(20), [Date] Date) 
insert into @T values(1, 'Furniture', 'Кресло', '2005-06-15')
insert into @T values(2, 'Furniture', 'Стул', null )
insert into @T values(3, 'Computer', 'Монитор', '2010-03-25')
insert into @T values(4, 'Computer', 'Системный блок', '2010-03-23')
insert into @T values(5, 'Computer', 'Монипулятор мышь',null )
insert into @T values(6, 'Floor', 'Бордюрный камень', '2011-02-20')
insert into @T values(7, 'Floor', 'Паркетная доска', null)
select * from @T

-- Решение

Update @T
set Name = 
(
	case 
		when LEN
		(
			Type + '_' + 
			Name + 
			case 
				when Date is not null then '_' + CAST(YEAR(Date) as varchar(4))
				when Date is null then ''
			end
		) > 20 then 
			Type + '_' + 
			SUBSTRING(Name, 0, 20 -
				LEN
				(
					Type + '_' +
					case 
						when Date is not null then '_' + CAST(YEAR(Date) as varchar(4))
						when Date is null then ''
					end
				) + 1) + 
			case 
				when Date is not null then '_' + CAST(YEAR(Date) as varchar(4))
				when Date is null then ''
			end
		else
			Type + '_' + 
			Name + 
			case 
				when Date is not null then '_' + CAST(YEAR(Date) as varchar(4))
				when Date is null then ''
			end 
	end
)
select * from @T
тут даже не суть важно, что именно он делает, подскажите плиз, как избавиться от дублирующего кода?
Например вынести вот этот блок:
					Type + '_' +
					case 
						when Date is not null then '_' + CAST(YEAR(Date) as varchar(4))
						when Date is null then ''
					end
Как это будет выглядеть?
22 июн 11, 16:40    [10856231]     Ответить | Цитировать Сообщить модератору
 Re: Как упростить запрос  [new]
_ч_
Member

Откуда:
Сообщений: 1446
Kudep,

если "не суть важно, что именно делает" ваш запрос, то вынести блок можно если переделать его в динамический. Выделить какую-нибудь переменную и туда внести повторяющуюся строку.
22 июн 11, 17:04    [10856555]     Ответить | Цитировать Сообщить модератору
 Re: Как упростить запрос  [new]
forestGreen
Member

Откуда:
Сообщений: 11
Вероятно нужно что-то вроде этого?
Update @T
set Name = 
(
	case 
		when LEN
		(
			commonPart2
		) > 20 then 
			Type + '_' + 
			SUBSTRING(Name, 0, 20 -
				LEN
				(
					Type + '_' +
					commonPart1
				) + 1) + 
			commonPart1
		else
			commonPart2 
	end
)
from @T x
cross apply (
	select 
		case 
			when Date is not null then '_' + CAST(YEAR(Date) as varchar(4))
			when Date is null then ''
		end as commonPart1
) y 
cross apply (
	select Type + '_' + Name + commonPart1 as commonPart2 
) z
22 июн 11, 17:11    [10856638]     Ответить | Цитировать Сообщить модератору
 Re: Как упростить запрос  [new]
Adony
Member

Откуда: Москва
Сообщений: 1085
все это можно записать так:
update @T
set Name = 
	case when Date is not null
	 then left(Type + '_' + Name, 15) + '_' + cast(year(Date) as varchar(4))
	 else left(Type + '_' + Name, 20) end
22 июн 11, 17:27    [10856794]     Ответить | Цитировать Сообщить модератору
 Re: Как упростить запрос  [new]
stimpi
Member

Откуда: Киев, Украина
Сообщений: 662
похоже на ответ Adony
select left(Type + '_' + Name, 15) + COALESCE('_' + CAST(YEAR(Date) as varchar(4)), SUBSTRING(Name, 15 - LEN(Type), 5))
from @t
22 июн 11, 18:44    [10857362]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить