TSQL - 是否可以定义排序顺序?

时间:2011-01-25 01:52:05

标签: sql sql-server tsql sql-server-2000 sql-order-by

是否可以为返回的结果定义排序顺序?

我希望排序顺序为'orange''apple''草莓'不上升或下降。

我知道ORDER BY可以做ASC或DESC但是有一个DEFINED('orange','apple','strawberry')类型的东西?

这将在SQL Server 2000上运行。

7 个答案:

答案 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)

使用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 

答案 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)

远离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中的值的开头。

答案 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