4

I have the following query:

SELECT id, title, adcontent, adtargetURL, locationpage, 
locationarg, locationid, displayorder, visible, schedstart, 
schedstop, created, modified, createdby, modifiedby
FROM ads            
ORDER BY locationpage, locationarg, locationid, title 

I need to order the fields the following way:

  • sort by locationpage with any fields with a value of 'all' first, then the rest in ascending order
  • then by locationarg with any NULL or empty string values first, then the rest in asc
  • then by locationid with any NULL or 0 values first, the rest in asc
  • and within those, sort by displayorder of '1' first, then NULL, then '2'
  • and lastly, by title in ASC if any of those manage to all be the same

What should my ORDER BY look like to achieve this?

Here's what I have so far: (updated from below)

ORDER BY locationpage='all', 
         locationpage ASC, 
         locationarg ASC, 
         locationid ASC, 
         displayorder='1', 
         ISNULL(displayorder), 
         displayorder='2', 
         title ASC

...but this isn't working!

4

2 回答 2

1

您最好的选择是使用一个计算字段,该字段将根据您的规则生成订单 ID。我稍后会添加一个示例。

select
case
  when locationpage = "all" then 10
  when ISNULL(locationarg)  then 20
  ....
  else 50 
end as OrderID,
id, 
title, 
....

FROM ads            

ORDER BY OrderID DSEC
于 2012-10-05T13:30:21.083 回答
0

给这个bash:

select id, title, adcontent, adtargetURL, locationpage, locationarg, locationid, displayorder, visible, schedstart, schedstop, created, modified, createdby, modifiedby 
from ads
order by case when locationpage='all' then 0 else 1 end, 
         locationpage, 
         case when locationarg is null or locationarg='' then 0 else 1 end,
         locationarg ASC, 
         case when locationid is null OR locationid='0' then 0 else 1 end, 
         locationid, 
         case when displayorder =1 then 0 when displayorder is null then 1 when displayorder = 2 then 2 else 3 end,
         title;
于 2012-10-05T13:35:21.023 回答