2009-08-23 3 views
8

У меня есть таблица определяется по формуле:ORDER BY на разных колонках в различных направлениях в SQLite

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, ubut Я не совсем уверен, что это такое.

ответ

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 collation, 'abc' = 'ABC'.

Следует отметить, что сортировка не набор символов. Обычно это определяется типом данных (varchar == ASCII, nvarchar == Юникод). Collation определяет, как сравниваются строки, а не какие наборы символов доступны для использования.

Кроме того, сопоставление также важно с некоторыми языками. Учитывая латинское сопоставление, вам просто нужно беспокоиться о капитализации и акцентах, но, учитывая датскую сортировку, 'aa' = 'å'. Итак, вы можете видеть, что сортировка играет большую роль в определении сортировки и сравнений для разных языков.

Сортировка очень важна при заказе, поскольку она определяет, как строки будут заказываться с учетом разных капитализаций и акцентов. Вот почему он продолжает появляться в ваших поисках. Важно отметить, что на этой неделе это будет affected StackOverflow!

: Спасибо Майклу Мэдсену за указание на этот конкретный пример.

+0

Сортировка - это не только вопрос сравнения заглавных букв и акцентов, но и сортировка символов в целом, включая обработку последовательностей регулярных символов, эквивалентных некоторому другому персонажу. Например, на датском языке «aa» по-прежнему является действительным способом написания «å», хотя å является последней буквой в датском алфавите, поэтому использование датской сортировки соответствующим образом сортирует текст (обычно это правильно, учитывая ожидаемый язык, и компьютер не может принять решение о своем собственном, если это случай, подобный немецкому городу Аахен, где aa, очевидно, не используется как å). –

+1

Спасибо. Я уверен, что я попробовал ваше предложение «заказать по индексу asc, _date desc', но без успеха. – jamesh

+0

@ jamesh: Действительно? Ты уверен? Потому что это будет работать практически на всех РСУБД. Единственный раз, когда я мог думать о том, что это не сработает, является то, что '_date' было полем' varchar', а не 'datetime'. Возможно, вам нужно инкапсулировать 'index' с обратными тактами, такими как' \ 'index \' '. – Eric

Смежные вопросы