TSQL - 是不是可以定义排序顺序?
Posted
技术标签:
【中文标题】TSQL - 是不是可以定义排序顺序?【英文标题】:TSQL - Is it possible to define the sort order?TSQL - 是否可以定义排序顺序? 【发布时间】:2011-06-14 22:12:17 【问题描述】:是否可以为返回的结果定义排序顺序?
我希望排序顺序是“橙色”“苹果”“草莓”而不是升序或降序。
我知道 ORDER BY 可以做 ASC 或 DESC,但是有 DEFINED('orange', 'apple', 'strawberry') 类型的东西吗?
这将在 SQL Server 2000 上运行。
【问题讨论】:
【参考方案1】:它非常笨重,但您可以使用 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
并将您的表加入到这个新表中。
【讨论】:
哈!就像我会相信来自 LittleBobbyTables 的任何 SQL :-) @pax - :-) 工作就像一个魅力,我希望我能添加 100 票。 如果我希望某些项目出现在 SELECT 结果的末尾怎么办?【参考方案2】:使用CASE statement:
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
【讨论】:
如果我希望某些项目出现在 SELECT 结果的末尾怎么办?【参考方案3】:如果这将是一个短暂的需求,请使用 case 语句。但是,如果您认为它可能会存在一段时间,并且始终是 orange/apple/strawberry
订单(或者即使不是 - 见下文),您可能需要考虑牺牲一些磁盘空间来获得一些速度。
在您的表中创建一个名为 or_ap_st
的新列,并使用插入/更新触发器来填充数字 1、2 或 3,具体取决于您的水果列的值。然后对其进行索引。
由于该列中的数据唯一会发生变化是行发生变化时,所以这是最好的时间。然后,少量写入而不是大量读取会产生成本,因此在select
语句中摊销。
然后您的查询将非常快:
select field1, field2 from table1
order by or_ap_st;
没有每行函数会影响性能。
而且,如果您还需要其他排序顺序,那么这就是我将列称为or_ap_st
的原因。您可以根据需要添加任意数量的其他排序列。
【讨论】:
【参考方案4】:在这种情况下我要做的是
ORDER BY
CASE WHEN FRUIT = 'Orange' THEN 'A'
WHEN FRUIT = 'Apple' THEN 'B'
WHEN FRUIT = 'Strawberry' THEN 'C'
ELSE FRUIT
END
【讨论】:
如果我希望某些项目出现在 SELECT 结果的末尾怎么办? 你可以使用非常高的数字或Z【参考方案5】:从turtlepick's answer走得更远:
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 值的开头。
【讨论】:
【参考方案6】:向表中添加一个键(例如fruit_id int identity(1,1) 主键)以保留插入顺序
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
【讨论】:
以上是关于TSQL - 是不是可以定义排序顺序?的主要内容,如果未能解决你的问题,请参考以下文章