Skip to content

Instantly share code, notes, and snippets.

@thluiz
Last active February 14, 2018 14:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save thluiz/228c9e496322695e66213815aa80254e to your computer and use it in GitHub Desktop.
Save thluiz/228c9e496322695e66213815aa80254e to your computer and use it in GitHub Desktop.
Trying to compare multiple implementations of dynamic ordering in sql server
create table #test_data(col1 varchar(100), col2 varchar(100))
declare @i int = 0
while (@i < 1000000)
begin
insert into #test_data(col1, col2)
values ('col1_' + right('00000000' + cast(@i as varchar(9)), 9), CONVERT(varchar(255), NEWID()))
set @i = @i + 1
end
declare @ordering_field int = 0
declare @descending bit = 1
set @ordering_field = 1
set @descending = 0
select top 100
ROW_NUMBER() OVER (ORDER BY case when @ordering_field = 1 then col1 else col2 end) * (1 - 2*@descending) rownumber, *
from #test_data
order by rownumber
set @ordering_field = 1
set @descending = 1
select top 100
ROW_NUMBER() OVER (ORDER BY case when @ordering_field = 1 then col1 else col2 end) * (1 - 2*@descending) rownumber, *
from #test_data
order by rownumber
set @ordering_field = 0
set @descending = 0
select top 100 *
from #test_data
order by
case when @descending = 1 then
case when @ordering_field = 1 then col1 else col2 end
end,
case when @descending = 0 then
case when @ordering_field = 1 then col1 else col2 end
end desc
set @ordering_field = 0
set @descending = 0
select top 100 *
from #test_data
order by
case when @descending = 1 then
case when @ordering_field = 1 then col1 else col2 end
end,
case when @descending = 0 then
case when @ordering_field = 1 then col1 else col2 end
end desc
set @ordering_field = 1
set @descending = 1
select top 100 *
from
(select ROW_NUMBER() OVER (order by col1) rownumber_col1,
ROW_NUMBER() OVER (order by col2) rownumber_col2,
*
from #test_data) t
order by
case when @ordering_field = 1 then rownumber_col1
else rownumber_col2 end
set @ordering_field = 0
set @descending = 0
select top 100 *
from
(select ROW_NUMBER() OVER (order by col1) rownumber_col1,
ROW_NUMBER() OVER (order by col2) rownumber_col2,
*
from #test_data) t
order by
case when @ordering_field = 1 then rownumber_col1
else rownumber_col2 end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment