orderby在sql查询中

时间:2009-11-24 02:07:27

标签: sql sql-order-by

我需要按列排序sql查询(此列中的三个不同值是C,E,T)。

我希望结果按E,C,T的顺序排列。所以,当然我不能在这一栏上使用升序或降序。

有任何建议我该怎么做?我不知道这是否重要,但我在tomcat上使用sybase数据服务器。

6 个答案:

答案 0 :(得分:6)

您可以通过在select子句中添加条件来实现。我不是Sybase人,但它可能看起来像这样:

SELECT col, if col = 'E' then 1 else if col = 'C' then 2 else 3 end AS sort_col
FROM some_table
ORDER BY sort_col

如果您的AS别名不起作用,您可以按基于列1的索引进行排序,如下所示:

ORDER BY 2

答案 1 :(得分:2)

您可以使用每行函数来更改列,如其他答案所述,但是,如果您希望此数据库能够很好地扩展,则每行函数很少是个好主意。

如果你的牌桌可能很小,请随意忽略这个建议。

这里的建议是有效的,因为一些一般的“事实”(我用引号标注它,因为它不是总是的情况,但根据我的经验,它主要是):

  1. 绝大多数数据库的阅读频率远远高于写入数据库。这意味着将计算成本转移到写入阶段而不是读取阶段通常是个好主意。
  2. 数据库的大多数问题往往是“我的查询很慢”类型,而不是“没有足够的磁盘空间”类型。
  3. 表总是比你想象的要大: - )
  4. 如果您的情况与这些“事实”相匹配,那么牺牲一点磁盘空间以加快查询速度是有意义的。最好只在必要时(插入/更新)产生计算成本,而不是在数据实际没有改变(选择)时。

    为此,您可以在表格中创建一个新列(例如ect_col_sorted),该列将保存数字排序值(如果您需要不同的soert订单,则可以创建多个列)。

    有一个插入/更新触发器,这样,无论何时在表中添加或更改行,您都会使用正确的值(E = 1,C填充排序字段= 2,T = 3,其他= 0)。然后在该列上放置一个索引,您的查询变得更简单(也更快):

    select ect_col, other_col_1, other_col_2
    from ect_table
    order by ect_col_sorted;
    

答案 2 :(得分:2)

其他方法有效,但这是一个经常被忽视的技巧(在MSSQL中,如果它在Sybase中工作,我不肯定):

select
  foo,
  bar
from
  bortz
order by
  case foo 
    when 'E' then 1
    when 'C' then 2 
    when 'T' then 3 
    else 4 
  end

答案 3 :(得分:1)

想法是添加带有条件的子查询,该条件将返回您的数据行加上虚拟值,如果有E则为0,对于E为1,对于T为2。然后只需按此列排序。

希望它有所帮助。

答案 4 :(得分:0)

psasik的解决方案将起作用,这个(使用哪个更快,取决于查询中还有其他内容):

select *
from some_table
where col = 'E'
UNION ALL
select *
from some_table
where col = 'C'
UNION ALL
select *
from some_table
where col = 'E'

应该可行,但你也可以这样做,对于可能被分页的大型数据集来说“更安全”......

select *, 1 as o
from some_table
where col = 'E'
UNION ALL
select *, 2 as o
from some_table
where col = 'C'
UNION ALL
select *, 3 as o
from some_table
where col = 'E'
ORDER BY o

在我写完上面之后,我认为这是最好的解决方案(请注意,我不知道这是否适用于sybase服务器,因为我现在无法访问,但如果它不能在那里工作只是将keysort内存表的创建拉出到变量或临时表 - 这是sybase支持的)

;WITH keysort (k,o) AS
(
   SELECT 'E',0
   UNION ALL
   SELECT 'C',1
   UNION ALL
   SELECT 'E',2
)
SELECT * 
FROM some_table
LEFT JOIN keysort ON some_table.col = keysort.k
ORDER BY keysort.o 

这应该是所有选择中最快的 - 在内存表中使用来利用sql的优化连接。

答案 5 :(得分:0)

你甚至可以使用Field()函数。

按字段排序(列名,E,C,T)

希望这有助于你