我试图做类似this question的事情。我有这张桌子:
tab_id
是第二列。 order_in_tab
是第四列。
我想首先按tab_id
等于2
,然后tab_id
的其余部分按升序排序,然后order_in_tab
升序。
select *
from cam_to_tab_mapping
where unit_id='90013550'
order by (tab_id='2') asc, tab_id asc, order_in_tab asc
然而,它说Incorrect syntax at '='.
。我是一个完整的SQL新手,所以我不确定出了什么问题(或者我是否误解了上面的链接解决方案)。
答案 0 :(得分:3)
尝试按以下方式更改查询:
select *
from cam_to_tab_mapping
where unit_id='90013550'
order by CASE WHEN tab_id='2' THEN 1 ELSE 0 END DESC, tab_id asc, order_in_tab asc
答案 1 :(得分:1)
我认为你有副本&在您的查询中粘贴错误。
select *
from cam_to_tab_mapping
where unit_id='90013550'
order by (tab_id='2') asc, tab_id asc, order_in_tab asc
您有一个逻辑表达式作为第一个order by
条件。
也许你的意思
select *
from cam_to_tab_mapping
where unit_id='90013550' and tab_id='2'
order by tab_id asc, order_in_tab asc
答案 2 :(得分:1)
您关联的问题是正确的。你只是误解了字段的类型。它有一个字符串字段,可以均衡为字符串。
所以在你的情况下你必须这样做:
select *
from cam_to_tab_mapping
where unit_id='90013550'
order by (tab_id=2) DESC,
tab_id asc, order_in_tab asc
(tab_id=2) DESC
会在结果中首先显示2的id。
在这里查看小提琴:http://sqlfiddle.com/#!2/15ffc/2
编辑:
OP表示它正在使用SQL Server。这个答案适用于MySQL。在SQL SERVER上,正确的方法是使用CASE语句,如:
select *
from cam_to_tab_mapping
where unit_id='90013550'
order by (case when tab_id=2 then 0 else 1 end),
tab_id, order_in_tab
答案 3 :(得分:0)
按顺序,您不能指定tab_id = 2。您必须添加另一个虚拟字段,对于tab_id = 2将为0,否则为1,然后按该字段排序,然后按tab_id排序。试试这种方式......
select mac, tab_id, unit_id, order_in_tab,
(case when tab_id='2' then 0 else 1 end) as temp
from cam_to_tab_mapping
where unit_id='90013550'
order by temp, tab_id, order_in_tab
您(可以)不需要在order by子句中指定asc,如果您没有指定任何内容,则默认为asc。