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

Откуда:
Сообщений: 585
Всем привет!
Народ, подскажите, можно ли записать вот эту часть кода покороче? Может функция есть какая-нибудь?
Case 
  when @order=1 then '11'
  when @order=11 then '1'
  when @order=2 then '22'
  when @order=22 then '2'
  when @order=3 then '33'
  when @order=33 then '3'
  when @order=4 then '44'
  when @order=44 then '4'
  when @order=5 then '55'
  when @order=55 then '5'
  else NULL
End
3 авг 04, 11:47    [854467]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли запись пакороче????  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37100
kika
Всем привет!
Народ, подскажите, можно ли записать вот эту часть кода покороче? Может функция есть какая-нибудь?
Case 
  when @order=1 then '11'
  when @order=11 then '1'
  when @order=2 then '22'
  when @order=22 then '2'
  when @order=3 then '33'
  when @order=33 then '3'
  when @order=4 then '44'
  when @order=44 then '4'
  when @order=5 then '55'
  when @order=55 then '5'
  else NULL
End

Если алгоритм скажете, чего-нить и придумать можно. Например, что если @order = 10? Или 1000?
3 авг 04, 11:57    [854512]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли запись пакороче????  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
функция... есть называиЦа она dbo.aaa

create function dbo.aaa (@i int)
returns varchar(100)
as begin
declare @s varchar(100)
 select @s =
  Case 
   when @order=1 then '11'
   when @order=11 then '1'
   when @order=2 then '22'
   when @order=22 then '2'
   when @order=3 then '33'
   when @order=33 then '3'
   when @order=4 then '44'
   when @order=44 then '4'
   when @order=5 then '55'
   when @order=55 then '5'
   else NULL
  End
 return @s
end


для спящего время бодрствования равносильно сну
3 авг 04, 11:59    [854520]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли запись пакороче????  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Case @order
  when 1 then '11'
  when 11 then '1'
  when 2 then '22'
  when 22 then '2'
  when 3 then '33'
  when 33 then '3'
  when 4 then '44'
  when 44 then '4'
  when 5 then '55'
  when 55 then '5'
  else NULL
End
или
Case Len(@order)
  when 1 then cast(@order as varchar)+cast(@order as varchar)
  when 2 then (case when left(cast(@order as varchar), 1)=right(cast(@order as varchar), 1) then left(cast(@order as varchar), 1) else NULL end)
  else NULL
End
правда этот вариант будет работать и на 6 - 9...
3 авг 04, 12:00    [854525]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли запись пакороче????  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
а без функции
declare @i int
set @i = 5
select left(replicate(cast(@i as varchar),2), 3-len(cast(@i as varchar)))


для спящего время бодрствования равносильно сну
3 авг 04, 12:03    [854548]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли запись пакороче????  [new]
kika
Member

Откуда:
Сообщений: 585
@order - входящий параметр.
Первоначально он может быть равен 1, 2, 3, 4 или 5.
После "Case" @order может быть равен 11, 22, 33, 44 или 55
3 авг 04, 12:05    [854558]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли запись пакороче????  [new]
kika
Member

Откуда:
Сообщений: 585
Алексей2003
а без функции
declare @i int
set @i = 5
select left(replicate(cast(@i as varchar),2), 3-len(cast(@i as varchar)))


для спящего время бодрствования равносильно сну

При входящем параметре @order=1 выдает 55!!!
???????????????
3 авг 04, 12:15    [854611]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли запись пакороче????  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37100
kika
Алексей2003
а без функции
declare @i int
set @i = 5
select left(replicate(cast(@i as varchar),2), 3-len(cast(@i as varchar)))


для спящего время бодрствования равносильно сну

При входящем параметре @order=1 выдает 55!!!
???????????????

Все правильно выдает.
3 авг 04, 12:16    [854618]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли запись пакороче????  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
охты епрст... прастите пожалуйста
declare @order int
set @order = 5
select left(replicate(cast(@order as varchar),2), 3-len(cast(@order as varchar)))


для спящего время бодрствования равносильно сну
3 авг 04, 12:17    [854622]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли запись пакороче????  [new]
kika
Member

Откуда:
Сообщений: 585
Хм!!!
Ложная тревога!!! :-))))))))
Забыла в @i на @order заменить!!!!
3 авг 04, 12:18    [854626]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли запись пакороче????  [new]
kika
Member

Откуда:
Сообщений: 585
Алексей2003
охты епрст... прастите пожалуйста
declare @order int
set @order = 5
select left(replicate(cast(@order as varchar),2), 3-len(cast(@order as varchar)))


для спящего время бодрствования равносильно сну


А такая запись будет быстрее работать, чем "Case"?
3 авг 04, 12:22    [854653]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли запись пакороче????  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
судите сами :)

declare @i int
declare @order int, @s varchar(10), @d datetime
set @i = 0
set @d = getdate()
while @i < 1000 begin
 set @order = @i % 5
 select @s = left(replicate(cast(@order as varchar),2), 3-len(cast(@order as varchar)))
 print @s
 set @i = @i + 1
end
select 'без case', datediff(ms, @d, getdate())
set @i = 0
set @d = getdate()
while @i < 1000 begin
 set @order = @i % 5
 select @s = Case 
  when @order=1 then '11'
  when @order=11 then '1'
  when @order=2 then '22'
  when @order=22 then '2'
  when @order=3 then '33'
  when @order=33 then '3'
  when @order=4 then '44'
  when @order=44 then '4'
  when @order=5 then '55'
  when @order=55 then '5'
  else NULL
 End
 print @s
 set @i = @i + 1
end
select 'с case', datediff(ms, @d, getdate())

для спящего время бодрствования равносильно сну
3 авг 04, 12:27    [854676]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли запись пакороче????  [new]
kika
Member

Откуда:
Сообщений: 585
Наверное, с "Case" быстрее!?
3 авг 04, 12:39    [854748]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли запись пакороче????  [new]
kika
Member

Откуда:
Сообщений: 585
Как вы все думаете, имеет смысл менять имеющийся "Case" на такую запись с целью ускорить время выполнения запроса:
declare @order int
set @order = 5
select left(replicate(cast(@order as varchar),2), 3-len(cast(@order as varchar)))
????????
3 авг 04, 12:46    [854789]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли запись пакороче????  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
я же дал код :) вставьте его в QA :) и оцените :) у меня без кейза быстрее...


для спящего время бодрствования равносильно сну
3 авг 04, 12:49    [854812]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли запись пакороче????  [new]
kika
Member

Откуда:
Сообщений: 585
А где в QA смотреть время выполнения запроса?
3 авг 04, 13:13    [854929]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли запись пакороче????  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
а если вы внимательно посмотрите, то заметите, что выдается 2 селекта, в которых пишется время в миллисекундах :)


для спящего время бодрствования равносильно сну
3 авг 04, 13:15    [854939]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли запись пакороче????  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
сделайте табличку с перекодирыванием и всё будет предельно коротко
3 авг 04, 14:39    [855404]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли запись пакороче????  [new]
kika
Member

Откуда:
Сообщений: 585
Есть запрос:
Order by
[City!2!IDOrder],
[City!2!Name],
[Date!3!ID],
[Item!4!ID],
CASE @order 
	when 1 then CONVERT(varchar(20), [Item!4!Name])
	when 2 then CONVERT(varchar(20), [Item!4!Categ])
	when 3 then CONVERT(varchar(20), [Item!4!Name])
	when 4 then CONVERT(varchar(20), [Item!4!Name])
	when 5 then CONVERT(varchar(20), [Item!4!Name])
	when null then  [Item!4!Price] end,
CASE @order 
	when 11 then CONVERT(varchar(20), [Item!4!Name])
	when 22 then CONVERT(varchar(20), [Item!4!Categ])
	when 33 then CONVERT(varchar(20), [Item!4!Name])
	when 44 then CONVERT(varchar(20), [Item!4!Name])
	when 55 then CONVERT(varchar(20), [Item!4!Name])
	else null end desc
FOR XML EXPLICIT

Кто-нибудь знает как можно записать его покороче?
3 авг 04, 16:16    [855855]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить