SQLite3: программно определить, отсортирован ли столбец в порядке возрастания или убывания - PullRequest
0 голосов
/ 21 сентября 2009

Предположим, у меня есть индекс для таблицы в 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 ]

2 голосов
/ 11 октября 2009

"без повторного разбора оператора CREATE INDEX" это действительно сложно;но получить SQL-код CREATE INDEX из таблицы sqlite_master и выполнить легкий анализ кажется достаточно простым.

Поскольку вы можете получить имена столбцов из PRAGMA, который вы уже определили, все, что вам нужно сделать, это токенизируйте этого SQL и проверьте токен (ы) сразу после (в SQL-коде CREATE INDEX) токена, который является именем столбца.

Там будет возможный COLLATE somecollation (который вывероятно, следует также записать, поскольку то, что используется для сортировки , в конце концов очень важно), и, возможно, после этих двух необязательных токенов, следующим будет ASC, DESC или что-то еще (что означает отсутствие порядкауказывается в SQL).

((Кстати, вам, несомненно, также нужна информация о том, является ли индекс уникальным - тот, который вы можете получить либо путем синтаксического анализа, либо, что еще лучше, с помощью "PRAGMA index_list"«на столе, который, я полагаю, вы уже делаете, чтобы получить имена индексов)).

Я не думаю, что вы должны делать предположения о том,Примите во внимание порядок (новый формат «нисходящий файл») или нет (устаревший формат) - это зависит от PRAGMA legacy_file_format ... и запрос его говорит вам, что произойдет с новыми базами данных,не то, что происходит с текущей БД.Таким образом, точная запись информации о заказе из схемы представляется мне более надежной стратегией.

1 голос
/ 06 октября 2009

Я не думаю, что порядок сортировки концептуально имеет какое-либо отношение к индексам. AFAIK это часть ANSI-SQL, но в основном игнорируется большинством СУБД (таких как Oracle).

Это, похоже, относится и к более старым версиям SQLite (из документации по SQLite):

За каждым именем столбца может следовать одно из ключевых слов "ASC" или "DESC", чтобы указать порядок сортировки. Порядок сортировки может или не может быть проигнорирован в зависимости от формата файла базы данных. «Устаревший» формат файла игнорирует порядок сортировки индекса.

По крайней мере, согласно документации, прагма index-info не помогает вам определить порядок сортировки в индексе. Похоже, вам не повезло ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...