是否可以为返回的结果定义排序顺序?
我希望排序顺序为'orange''apple''草莓'不上升或下降。
我知道ORDER BY可以做ASC或DESC但是有一个DEFINED('orange','apple','strawberry')类型的东西?
这将在SQL Server 2000上运行。
答案 0 :(得分:51)
令人难以置信的笨重,但您可以使用CASE语句进行排序:
SELECT * FROM Blah
ORDER BY CASE MyColumn
WHEN 'orange' THEN 1
WHEN 'apple' THEN 2
WHEN 'strawberry' THEN 3
END
或者,您可以创建一个包含排序字段和排序顺序的辅助表。
TargetValue SortOrder
orange 1
apple 2
strawberry 3
将你的桌子加入这张新桌子。
答案 1 :(得分:10)
ORDER BY CASE your_col
WHEN 'orange' THEN 1
WHEN 'apple' THEN 2
WHEN 'strawberry' THEN 3
END
使用ELSE的替代语法:
ORDER BY CASE
WHEN your_col = 'orange' THEN 1
WHEN your_col = 'apple' THEN 2
WHEN your_col = 'strawberry' THEN 3
ELSE 4
END
答案 2 :(得分:7)
如果这是一个短期要求,请使用案例陈述。但是,如果您认为它可能会存在一段时间,并且总是会orange/apple/strawberry
订购(或者即使不是 - 请参见下文),您可能需要考虑牺牲一些磁盘空间来获得一些速度。
在表中创建一个名为or_ap_st
的新列,并使用插入/更新触发器将其填入数字1,2或3,具体取决于水果列的值。然后索引它。
由于该列中的数据发生变化的唯一时间是行更改时,这是执行此操作的最佳时间。然后,成本将在少量写入而不是大量读取上产生,因此在select
语句上摊销。
您的查询将非常快:
select field1, field2 from table1
order by or_ap_st;
没有每行功能会导致性能下降。
而且,如果您还想要其他排序顺序,那就是我调用列or_ap_st
的原因。您可以根据需要添加任意数量的其他排序列。
答案 3 :(得分:2)
在这种情况下我做的是
ORDER BY
CASE WHEN FRUIT = 'Orange' THEN 'A'
WHEN FRUIT = 'Apple' THEN 'B'
WHEN FRUIT = 'Strawberry' THEN 'C'
ELSE FRUIT
END
答案 4 :(得分:1)
ORDER BY
CASE WHEN FRUIT = 'Orange' THEN 'A'
WHEN FRUIT = 'Apple' THEN 'B'
WHEN FRUIT = 'Strawberry' THEN 'C'
ELSE FRUIT
END
如果您在FRUIT中有更多项目,并且它们恰好以THEN关键字后定义的字母开头,那么这些项目将出现在硬编码顺序中。例如香蕉出现在草莓之前。你可以用
来规避它ORDER BY
CASE
WHEN FRUIT = 'Orange' THEN '.1'
WHEN FRUIT = 'Apple' THEN '.2'
WHEN FRUIT = 'Strawberry' THEN '.3'
ELSE FRUIT
END
这里我使用了较低ASCII值的字符,希望它们不会出现在FRUIT中的值的开头。
答案 5 :(得分:0)
向表中添加一个键(例如fruit_id int identity(1,1)主键)以保留insert的顺序
create table fruit(fruit_id int identity(1,1) primary key, name varchar(50))
go
insert into fruit(name) values ('orange')
insert into fruit(name) values ('apple')
insert into fruit(name) values ('strawberry')
select name from fruit
结果:
orange
apple
strawberry
答案 6 :(得分:0)
不常见,但对于单值操作或特定模式, REPLACE 也适用
例如
DECLARE @Fruit TABLE (Fruit_Id INT IDENTITY(1, 1) PRIMARY KEY ,Name VARCHAR(50));
INSERT INTO @Fruit (Name) VALUES ('Orange');
INSERT INTO @Fruit (Name) VALUES ('Apple');
INSERT INTO @Fruit (Name) VALUES ('Strawberry');
INSERT INTO @Fruit (Name) VALUES ('__Pear');
SELECT * FROM @Fruit AS f
ORDER BY REPLACE(f.Name,'__','')
Fruit_Id Name
----------- --------------------------------------------------
2 Apple
1 Orange
4 __Pear
3 Strawberry