2010-12-06 1 views
0

Я использую SQLite DB в своем приложении для Android.SQLite sorting question

В колонке есть цифры и строки. Нечто подобное:

3, 1, 2, 6/6A, Х, 3А, 10, 12, XY, 44, ZW

Если я выбираю значения этого столбца и сортировать их, я получаю:

1, 10, 12, 2, 3, 3А, 44, 6/6A, X, XY, ZW

есть ли возможность в SQLite сортировать эти значения так, что я хотел бы получить:

1, 2, 3, 3A, 6/6A, 10, 12, 44, X, XY, ZW

Спасибо,

Стена

ответ

1

После многих экспериментов я получил правильный запрос:

select _id, case 
when cast(_id as number) = 0 then _id 
when cast(_id as number) <>0 then cast(_id as number) 
end as sorting 
from lines 
order by sorting 

хорошая вещь, что операция литья возвращается на 6 назад «6/6А».

UPD

Не знаю почему, но если я использую этот запрос в моей андроид приложения, я получаю _id столбец как числа, так что я должен сделать отливку в текст

select cast(_id as text) as _id, case 
when cast(_id as number) = 0 then _id 
when cast(_id as number) <>0 then cast(_id as number) 
end as sorting 
from lines 
order by sorting 
1

Вы можете сортировать чистые номера и чистые строки как желательные просто хранить числа как числа (вы в настоящее время хранения все как строки).

Гибриды (3A и 6A) сложнее. Одним из вариантов являются извлечением цифрового префикса и хранить, что в колонке сортировки (наряду с другими значениями немодифицированных):

original sort 
    1  1 
    2  2 
    6A  6 
    6  6 
    3A  3 
    X  X 
    XY  XY 

Затем упорядочить по сортировочной колонке с последующей исходной колонкой:

SELECT * FROM MyTable 
ORDER BY sort, original 
+0

вы имеете в виду, что я Shoul d имеют таблицы differents для чисел и строк? а затем просто использовать союз ?! – Tima 2010-12-06 17:05:22

0

Воодушевленные решениями Tima и Марсело Cantos я нашел следующее решение:

SELECT * FROM MyTable ORDER BY CAST(original AS INTEGER), original;