代码之家  ›  专栏  ›  技术社区  ›  jamesh

按SQLite中不同方向的不同列排序

  •  8
  • jamesh  · 技术社区  · 15 年前

    我有一个表定义为:

        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>
    

    如何按索引升序和日期降序排列所选内容?也就是说,小索引在大索引之前。如果两个索引相同,则后面的日期应排在第一位。

    文档向我指出了排序规则,但是我不确定这是什么。

    1 回复  |  直到 15 年前
        1
  •  21
  •   Community CDub    8 年前

    虽然我知道你在这里已经有了自己的答案,但我认为在这里讨论工作细节是有意义的。

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

    order by index asc, _date desc
    

    按顺序排序 index 最小到最大( asc 结束) 然后 _date 最大到最小( desc 结束)。同时 ASC 是默认值,我通常在有多个列朝相反方向时包括它,就像您在这里做的那样。

    您还可以在 按顺序 :

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

    这会把所有的否定 指数 行在顶部,然后按排序 _日期 . 在您的 按顺序 条款在某些情况下非常有效。

    现在,你提到 collation 还有一点困惑。排序规则是数据库在字符串比较中处理大写和重音的方式。通过对标题敏感的排序, 'abc' != 'ABC' . 但是,使用不区分大小写的排序规则, 'abc' = 'ABC' .

    应该注意的是,整理 字符集。通常由数据类型决定( varchar ==ascii码, nvarchar = Unicode)。排序规则确定字符串的比较方式,而不是可供使用的字符集。

    此外,在某些语言中,整理也很重要。如果是拉丁语,你只需要担心大写字母和重音符号,但是如果是丹麦语, 'aa' = 'Ã¥' . 因此,您可以看到,排序在确定不同语言的排序和比较方面也起着很大的作用。

    排序规则在排序时非常重要,因为它决定了在给定不同的大写字母和重音的情况下如何排序字符串。这就是为什么它在你的搜索中不断出现的原因。整理很重要,甚至 affected StackOverflow 本周!

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