奇怪的SQL查询

时间:2012-09-17 18:16:39

标签: sql sql-server sql-server-2008 tsql

我正在研究一个项目,我有一个奇怪的要求。

我有一个表A,其中包含字段(TechID(Primary Key), Orders (INTEGER NUMBER),Name (Varchar))

Orders的值可以是0, 1, 2, 3, .......我的任务是显示由Orders字段排序的表格的内容。首先显示Orders字段的值为1的行,然后依次显示其中的行。必须在末尾显示值为0的行。如果所有Orders字段的值均为0,则需要按TechID字段对表格进行排序。

有关实现这一目标的任何想法?这可以通过SQL查询实现,还是应该为此编写T-Sql脚本?

4 个答案:

答案 0 :(得分:9)

这很简单:

select *
from A
order by case Orders     -- 1. Orders values
           when 0 then 2 --    of zero collate after
           else        1 --    non-zero Orders values
         end ,           --
         Orders ,        -- 2. Then collate by Orders value proper
         TechID          -- 3. Then by TechID

答案 1 :(得分:3)

实际上没有测试它,但这个一般的想法应该有效:

SELECT * FROM A
ORDER BY
    CASE Orders WHEN 0 THEN 2147483647 ELSE Orders END,
    TechID

注意:这假设Ordersint。如果它的bigint改为使用9,223,372,036,854,775,807。

答案 2 :(得分:1)

在ORDER BY子句中使用case语句。当所有订单值均为0时,TechID的二级排序将按照您的要求对TechID进行排序。

SELECT *
FROM A
ORDER BY
   Case
      When (Orders = 0) Then 9999
      Else   Orders
   End,
   TechID

答案 3 :(得分:0)

不知道它是否适用于oracle的其他数据库

SELECT * 从T ORDER BY命令空值最后