powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Сортировка в заданном порядке
7 сообщений из 7, страница 1 из 1
Сортировка в заданном порядке
    #40099457
reaque
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица сотрудников:
1 Настя
2 Александр
3 Ольга
4 Антон
5 Сергей

Есть необходимость вывести строки в заданном порядке, например:
3, 1, 2, 5, 4

Я нашел 2 способа написания запроса:
select * from table_name
where id in (3, 1, 2, 5, 4)
order by case
when id =3 then 1
when id =1 then 2
when id =2 then 3
when id =5 then 4
when id =4 then 5
end

select * from table_name where id=3
union
select * from table_name where id=1
union
select * from table_name where id=2
union
select * from table_name where id=5
union
select * from table_name where id=4

На мой взгляд эти вопросы не оптимальны. При увеличении строк в таблице увеличивается количество строк в запросе, есть ли более простой способ написания запроса?
...
Рейтинг: 0 / 0
Сортировка в заданном порядке
    #40099459
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну, заведите таблицу с двумя полями, ID и весом при сортировке.
Заполняйте, джойните, сортируйте по весу из этой таблицы.
...
Рейтинг: 0 / 0
Сортировка в заданном порядке
    #40099554
reaque
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
порядок может постоянно меняться.
строк несколько тысяч, пользователь последовательно выбирает нужные строки, выгрузиться в отчет они должны в той же последовательности, в которой он их выбрал.

у нас есть строка вида "(3, 1, 2, 5, 4)"
хотелось бы написать в запросе что-то типа
where id in (3,1,2,5,4)
order by id (3,1,2,5,4),

т.е. явно задать сортировку
...
Рейтинг: 0 / 0
Сортировка в заданном порядке
    #40099591
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
reaque
порядок может постоянно меняться.
строк несколько тысяч, пользователь последовательно выбирает нужные строки, выгрузиться в отчет они должны в той же последовательности, в которой он их выбрал.

у нас есть строка вида "(3, 1, 2, 5, 4)"
хотелось бы написать в запросе что-то типа
where id in (3,1,2,5,4)
order by id (3,1,2,5,4),

т.е. явно задать сортировку


это упростит код, но замедлит скорость запроса

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create or alter function [dbo].[myOrder] (
      @pattern varchar(255),
      @id int
)
returns int as begin
   with x as (
       select row_number() over (order by 1/0) as [rn], try_cast([value] as int) as [value]
       from string_split(replace(replace(replace(@pattern, '(', ''),')', ''), ' ', ''), ',')
   )
   select @id = min(rn) from x where [value] = @id;
   return isnull(@id, 999);
end;



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
declare @myData table (
[id] int,
[value] varchar(255)
);
insert into @myData values
(1, 'Настя'),
(2, 'Александр'),
(3, 'Ольга'),
(4, 'Антон'),
(5, 'Сергей')

select  * from @myData T
order by [dbo].[myOrder]('(5, 1, 2, 4, 3)', T.id) asc  
...
Рейтинг: 0 / 0
Сортировка в заданном порядке
    #40099592
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну, а в чем проблема? Эти 3,1,2,5,4 в переменную можете получить?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
DECLARE @w VARCHAR(100) = '3,1,2,5,4';

; With s as (
SELECT [value] [id], CONVERT(int, [key]) [key]
FROM OPENJSON(CONCAT('["', REPLACE(@w, ',', '","'), '"]'))
)
select * from table_name a inner join s on a.id = s.id
Order by s.key ASC
...
Рейтинг: 0 / 0
Сортировка в заданном порядке
    #40099659
reaque
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У нас Microsoft SQL Server 2014.

OPENJSON (Transact-SQL). Применимо к: даSQL Server 2016 (13.x); и более поздние версии
...
Рейтинг: 0 / 0
Сортировка в заданном порядке
    #40099664
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну... Это не оговаривалось :-)
Впрочем, через xml - тоже можно.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DECLARE @w VARCHAR(100) = '3,1,2,5,4';

;With s as (select
   t.value('for $i in . return count(../*[. << $i]) + 1', 'int') [key]
  ,t.value('.','varchar(max)') as [id]
from (Values (Cast(N'<root><r>' + replace((SELECT @w FOR XML PATH('') ), ',', '</r><r>') + '</r></root>' as xml))) x(x)
	Cross apply x.x.nodes('//root/r') as a(t)
)
select * from table_name a inner join s on a.id = s.id
Order by s.key ASC
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Сортировка в заданном порядке
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]