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

Откуда:
Сообщений: 42
Помогите, пожалуйста, никак не могу составить запрос. Надо отсортировать так, чтобы nulls были всегда в конце, и сортировка должна быть динамической. По отдельности эти две задачи я сделать могу, а совместить что-то никак.

Вот сама сортировка:

declare @sortingDir nvarchar(20)
declare @sortingCol  nvarchar(20)
set @sortingDir='DESC'
set @sortingCol='name'

CREATE TABLE #temp  (id int, name int, name1 int)
insert into #temp
select 1, null, null
union 
select 2,1,1
union
select 3,null, null
union
select 4,2,2
union
select 5,3,4
union
select 6,4,3

select
 id,
 name,
 name1
from #temp

ORDER BY 
case when @sortingDir='DESC' and @sortingCol='name' then ..... end  DESC,
case when @sortingDir='DESC' and @sortingCol='name1' then .... end  DESC,
case when @sortingDir='ASC' and @sortingCol='name' then ..... end  ASC,
case when @sortingDir='ASC' and @sortingCol='name1' then ..... end  ASC
 
drop  TABLE #temp 

В нее вместо .... надо вставить (case when (соответствующая @sortingCol) is null then 1 else 0 end),(соответствующая @sortingCol), т.е. например, в первой строке (case when name is null then 1 else 0 end),name.
19 авг 09, 19:11    [7558502]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с синтаксисом  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21520
case when @sortingDir='DESC' and @sortingCol='name' then ISNULL(name, 2147483647) end  DESC,
19 авг 09, 19:26    [7558539]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с синтаксисом  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21520
сорри

case when @sortingDir='DESC' and @sortingCol='name' then ISNULL(name, -2147483648) end  DESC,
case when @sortingDir='DESC' and @sortingCol='name1' then ISNULL(name, -2147483648) end  DESC,
case when @sortingDir='ASC' and @sortingCol='name' then ISNULL(name, 2147483647) end  ASC,
case when @sortingDir='ASC' and @sortingCol='name1' then ISNULL(name1, 2147483647) end  ASC
19 авг 09, 19:28    [7558545]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с синтаксисом  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21520
еще раз сорри, во второй строке - name1
19 авг 09, 19:30    [7558549]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с синтаксисом  [new]
JuliJ
Member

Откуда:
Сообщений: 42
Спасибо, Shocker.Pro!
19 авг 09, 19:44    [7558583]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с синтаксисом  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21520
Не за что.

Только помните, не стоит так сортировать таблицы с большим количеством строк, ибо не используется индекс.
19 авг 09, 19:47    [7558594]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с синтаксисом  [new]
JuliJ
Member

Откуда:
Сообщений: 42
Вы имеете ввиду динамический сортинг?Если да, то какая алтернатива динамическому сортингу, кроме динамического запроса?
Или вы имеете ввиду, что надо добавить индекс на эти колонки?
20 авг 09, 18:20    [7563672]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с синтаксисом  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21520
Ну этот вопрос вроде подробно разобран в факе.

Лично я поступаю так - делаю запрос в виде инлайновой функции, и оборачиваю ее вызов динамическим запросом. Так удобно и работать и отлаживать и использовать функцию как подзапрос для других и т. п., ну а для клиентского вызова динамическая обертка, в которой нет ничего кроме "select *" и "order by".
20 авг 09, 18:25    [7563702]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить