我需要按列排序sql查询(此列中的三个不同值是C,E,T)。
我希望结果按E,C,T的顺序排列。所以,当然我不能在这一栏上使用升序或降序。
有任何建议我该怎么做?我不知道这是否重要,但我在tomcat上使用sybase数据服务器。
答案 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)
您可以使用每行函数来更改列,如其他答案所述,但是,如果您希望此数据库能够很好地扩展,则每行函数很少是个好主意。
如果你的牌桌可能很小,请随意忽略这个建议。
这里的建议是有效的,因为一些一般的“事实”(我用引号标注它,因为它不是总是的情况,但根据我的经验,它主要是):
如果您的情况与这些“事实”相匹配,那么牺牲一点磁盘空间以加快查询速度是有意义的。最好只在必要时(插入/更新)产生计算成本,而不是在数据实际没有改变(选择)时。
为此,您可以在表格中创建一个新列(例如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)
希望这有助于你