SQLite3:以编程方式确定列是按升序还是降序排序

时间:2009-09-21 10:24:34

标签: sql sqlite indexing

假设我在SQLite3中有一个表索引:

CREATE TABLE Person (id integer primary key, firstName varchar(20), lastName varchar(20), address varchar(200));
CREATE INDEX IX_Person ON Person (lastName ASC, firstName ASC);

我可以发现索引中的哪些列如下:

sqlite> pragma index_info('ix_person');
0|2|lastName
1|1|firstName

但是这并没有告诉我排序的列是按升序还是降序排列。

有没有办法以编程方式确定这个而不重新解析CREATE INDEX语句?

2 个答案:

答案 0 :(得分:2)

“没有重新解析CREATE INDEX语句”这真的很难;但是从sqlite_master表中获取CREATE INDEX sql代码并进行轻量级解析似乎相当容易。

由于您可以从已经识别的PRAGMA中获取列名,因此您需要做的就是 tokenize 该SQL并立即检查令牌(在CREATE INDEX sql code)作为列名的标记。

可能会COLLATE somecollation(您可能也应该记录,因为正在使用的排序规则 毕竟非常重要),并且可能在这两个可选标记之后,下一个将是ASC,DESC或其他东西(意味着SQL中没有指定顺序)。

((顺便说一下,你肯定也想知道关于索引是否是唯一的信息 - 你可以通过解析,或者可能更好,通过桌面上的“PRAGMA index_list”获得的信息,我想你是无论如何都已经做了索引名称))。

我认为您不应该假设索引文件是否考虑了排序(较新的“降序文件”格式)或不考虑(遗留格式) - 这取决于PRAGMA legacy_file_format ...和查询它会告诉您新数据库会发生什么,而不是当前数据库发生了什么。因此,忠实地记录模式中的订购信息对我来说似乎是一个更强大的策略。

答案 1 :(得分:1)

我不认为排序顺序在概念上与索引有任何关系。 AFAIK是ANSI-SQL的一部分,但大多数RDBMS(如Oracle)都忽略了它。

对于旧版本的SQLite,似乎也是如此(来自SQLite文档):

  

每个列名后面都可以跟一个“ASC”或“DESC”关键字来表示排序顺序。根据数据库文件格式,可能会也可能不会忽略排序顺序。 “遗留”文件格式忽略索引排序顺序。

至少根据文档,index-info pragma无法帮助您确定索引中的排序顺序。所以看起来好像你运气不好......