我需要以非常规顺序对查询结果进行排序。
说,我搜索“主席”。我希望所有与Chair一起开始的记录按字母顺序排在第一位,然后按字母顺序列出随后列出的其他记录。因此,“蓝色椅子”将列在“蓝色椅子”之后。例如。
请注意STARTING和CONTAINING条件。 我该如何实现这种方式?感谢。
答案 0 :(得分:4)
您可以将ORDER BY与函数(您自己的,或PATINDEX,如下所示)一起使用,例如:
create table test (value varchar(255))
delete from test
insert into test values ('Foo')
insert into test values ('Bar')
insert into test values ('BlueChair')
insert into test values ('Chair')
insert into test values ('NotABlueChair')
insert into test values ('chairs')
insert into test values ('Zoo')
select * from test where value like '%chair%' order by PATINDEX('%chair%', value)
<强>返回:强>
Chair
chairs
BlueChair
NotABlueChair
答案 1 :(得分:3)
(原来这是特定于MySQL的)
我在SQL中提出的最短内容如下:
SELECT * FROM table
WHERE column LIKE '%chair%'
ORDER BY IF(column LIKE 'chair%', 0, 1), column;
IF给出以'chair'开头的行为0和不为1的行.SQL中的排序顺序根据首先指定的第一个“列”对行进行排序,然后在该排序顺序中排序将根据第二个进行排序,依此类推。
为了澄清,这就是ORDER BY的样子:
ChairBlack = 0, 'ChairBlack'
BlackChair = 1, 'BlackChair'
Hello Chair = 1, 'Hello Chair'
Chair = 0, 'Chair'
将它排序为:
Chair = 0, 'Chair'
ChairBlack = 0, 'ChairBlack'
BlackChair = 1, 'BlackChair'
Hello Chair = 1, 'Hello Chair'
答案 2 :(得分:2)
这看起来如何?
SELECT *, 1 as sort_pref FROM table WHERE column LIKE 'CHAIR%'
UNION
SELECT *, 2 as sort_pref FROM table WHERE column LIKE '%CHAIR%' AND column NOT LIKE 'CHAIR%'
ORDER BY sort_pref, column