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 - 是不是可以定义排序顺序?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Comparator 定义自定义排序顺序?

查询中的 TSQL 顺序/序列组

R语言ggplot2可视化X轴因子变量自定义排序,而不是按照默认的字母顺序排序实战

TSQL order by 子句中排序列的多种写法

python按自定义顺序排序字典列表[重复]

TSQL编程