SQLite3:通过编程确定列是按升序还是降序排序

SQLite3:通过编程确定列是按升序还是降序排序,sql,sqlite,indexing,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('i

假设我在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
语句的情况下通过编程确定这一点?

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

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

每个列名后面可以跟一个“ASC”或“DESC”关键字,以指示排序顺序。排序顺序可以忽略,也可以不忽略,具体取决于数据库文件格式。“传统”文件格式忽略索引排序顺序


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

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

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

每个列名后面可以跟一个“ASC”或“DESC”关键字,以指示排序顺序。排序顺序可以忽略,也可以不忽略,具体取决于数据库文件格式。“传统”文件格式忽略索引排序顺序

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

“如果不重新解析CREATEINDEX语句”,这真的很难;但是从
sqlite\u master
表中获取创建索引sql代码并进行轻量级解析似乎相当容易

由于您可以从已标识的
PRAGMA
中获取列名,因此只需将该SQL标记化,并在列名标记之后(在创建索引SQL代码中)立即检查标记

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

((顺便说一句,您无疑还需要关于索引是否唯一的信息——您可以通过解析或更好地使用表上的“PRAGMA index_list”来获取该信息,我想您已经在做这些工作来获取索引名了))

我认为您不应该假设索引文件是否考虑排序(较新的“降序文件”格式)或不考虑排序(旧格式)——这取决于……查询它会告诉您新数据库将发生什么,而不是当前数据库将发生什么。因此,忠实地记录模式中的排序信息对我来说似乎是一种更为稳健的策略。

“如果不重新解析CREATEINDEX语句”,这真的很困难;但是从
sqlite\u master
表中获取创建索引sql代码并进行轻量级解析似乎相当容易

由于您可以从已标识的
PRAGMA
中获取列名,因此只需将该SQL标记化,并在列名标记之后(在创建索引SQL代码中)立即检查标记

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

((顺便说一句,您无疑还需要关于索引是否唯一的信息——您可以通过解析或更好地使用表上的“PRAGMA index_list”来获取该信息,我想您已经在做这些工作来获取索引名了))


我认为您不应该假设索引文件是否考虑排序(较新的“降序文件”格式)或不考虑排序(旧格式)——这取决于……查询它会告诉您新数据库将发生什么,而不是当前数据库将发生什么。因此,忠实地记录模式中的排序信息对我来说似乎是一种更为稳健的策略。

我正在努力思考一个重要的问题——您有使用案例吗?@Mike Woodhouse,我想在模式管理工具中而不是在主应用程序中这样做。我正在创建一组相关的表,其中一个表中的索引必须复制到另一个表中(带有额外的列)。我正在努力思考一个重要的问题——您是否有一个用例?@Mike Woodhouse,我想在模式管理工具中,而不是在主应用程序中执行此操作。我正在创建一组相关表,其中一个表中的索引必须复制到另一个表中(带有附加列)这似乎对多列索引有很大的影响。如果它肯定会被忽略,那么始终将其视为ASC将是一个可接受的解决方案。对于多列索引,索引中列的顺序很重要,但我看不到排序顺序有多大影响。我认为索引就像一棵平衡良好的树,所以asc和desc之间的区别应该是“向左转”还是向右转,但它不应该影响树的深度。这似乎对多列索引有很大影响。如果它肯定会被忽略,那么始终将其视为ASC将是一个可接受的解决方案。对于多列索引,索引中列的顺序将很重要,但我看不到