在SQLite中不同方向的不同列上的ORDER BY

时间:2009-08-23 22:45:29

标签: sql sqlite syntax

我有一个由:

定义的表格
    CREATE TABLE bar_table (
        _id INTEGER NOT NULL PRIMARY KEY,
        index INTEGER NOT NULL DEFAULT '65535',
        _date DATE
    )

我的基本选择陈述是:

SELECT * FROM bar_table ORDER BY <your-clause-here>

如何通过索引升序和日期降序来订购我的选择?即小指数出现在大型指数之前。如果两个索引相同,则较晚的日期将首先出现。

文档指向了COLLATion,但我不确定那是什么。

1 个答案:

答案 0 :(得分:21)

虽然我知道你已经在这里找到了自己的答案,但我认为在这里详细介绍这些细节是恰当的。

首先,order by子句按指定的列或表达式的顺序排列。在这种情况下:

order by index asc, _date desc

index从最小到最大(asc结尾)排序,然后 _date从最大到最小(desc结尾)排序。虽然asc是默认值,但是当我有多个列朝向相反方向时,我通常会将其包含在内,就像您在此处一样。

您还可以在order by中添加表达式:

order by case when index < 0 then 1 else 0 end desc, _date desc

这会将所有否定的index行放在顶部,然后按_date排序。在某些情况下,在order by子句中使用表达式非常有效。

现在,你提到了collation,并对这是什么有点困惑。排序规则是数据库如何在字符串比较中处理大写和重音。使用Captial-Sensitive排序规则'abc' != 'ABC'。但是,使用Captial-Insensitive排序规则'abc' = 'ABC'

应该注意的是,归类是字符集。这通常由数据类型(varchar == ASCII,nvarchar == Unicode)决定。排序规则确定如何比较字符串,而不是可以使用的字符集。

此外,整理对某些语言也很重要。鉴于拉丁文整理,你只需要担心大写和口音,但是给出丹麦校对,'aa' = 'å' 1 所以你可以看到校对在确定排序和比较中起着重要作用对于不同的语言。

排序在排序时非常重要,因为它决定了如何根据不同的大写和重音来排序字符串。这就是为什么它一直在你的搜索中出现。整理很重要,本周甚至是affected StackOverflow

1 :感谢Michael Madsen指出这个具体的例子。