我在SQLite中(在Android上)排序歌曲。我想訂購他們:ORDER BY只能在SQLite中使用字母數字字符
- 不區分大小寫
- ,並在最後領先位數,由整數值。
- 沒有標點符號(例如括號,句號,連字符,撇號)
我有1 & 2個工作(見下文)。然而,我不知道如何替換每個字符(字母,數字和空格除外),而不是爲每個字符調用replace()
。
有沒有辦法做到這一點,而不是32調用replace()
?
(ASCII值33-47,58-64,91-96,123-126)
下面是測試表。理想值n應該按順序排列。 (否,則無法通過n
訂購)
create table songs (n integer, name text);
insert into songs (n,name) values (6,'I''ll Be That Girl');
insert into songs (n,name) values (24,'1969');
insert into songs (n,name) values (9,'La Moldau');
insert into songs (n,name) values (20,'Pule');
insert into songs (n,name) values (7,'I''m a Rainbow Too');
insert into songs (n,name) values (21,'5 Years');
insert into songs (n,name) values (18,'Pressure');
insert into songs (n,name) values (13,'Lagan');
insert into songs (n,name) values (1,'any old wind that blows');
insert into songs (n,name) values (17,'Poles Apart');
insert into songs (n,name) values (8,'Imagine');
insert into songs (n,name) values (14,'Last Stop before Heaven');
insert into songs (n,name) values (3,'I Before E Except After C');
insert into songs (n,name) values (4,'i do, i do, i do');
insert into songs (n,name) values (22,'99 Luftballons');
insert into songs (n,name) values (12,'L''accord parfait');
insert into songs (n,name) values (15,'Pluto');
insert into songs (n,name) values (19,'The Promise');
insert into songs (n,name) values (2,'(Don''t Fear) The Reaper');
insert into songs (n,name) values (10,'L.A. Nights');
insert into songs (n,name) values (23,'911 is a Joke');
insert into songs (n,name) values (5,'Ichthyosaurs Are Awesome');
insert into songs (n,name) values (11,'Labradors are Lovely');
insert into songs (n,name) values (16,'P.O.D.-Boom');
這裏的溶液至剛好1 & 2以上:
SELECT n
FROM songs
ORDER BY
CASE WHEN name GLOB '[0-9]*' THEN 1
ELSE 0
END,
CASE WHEN name GLOB '[0-9]*' THEN CAST(name AS INT)
ELSE name
END
COLLATE NOCASE
對於此測試設置產生的順序的結果:2,1,3,4,6,7,5,8,12,10,9,11,13,14,16,15,17,18,20,19,21,22,23,24
我可以通過手動替換每個不需要的字符來修復此特定測試集:
SELECT n
FROM songs
ORDER BY
CASE WHEN name GLOB '[0-9]*' THEN 1
ELSE 0
END,
CASE WHEN name GLOB '[0-9]*' THEN CAST(name AS INT)
ELSE
replace(
replace(
replace(
replace(name,'.',''),
'(',''
),
'''',''
),
' ',' '
)
END
COLLATE NOCASE
如果有幫助,我可以依靠SQLite 3.8.6或更高版本。目前,我只針對Android L,並且很快將針對Android M. – Phrogz
@ Phrogz ..爲什麼不嘗試採用原始字符串長度和標點符號替換爲'''的字符串長度(空字符串),並在這個問題中排序第3位? –
我不認爲你得到了我。這是我想傳達的。對於一個字符串'ab,c'它將是len(orig_string)是4並且len(用''替換的orig_string_with_punctuation是3)。所以這樣你得到的diff就是'1'。而對於沒有標點符號的字符串,這個差異將是0.所以你可以在'order by'子句中使用這些差異。希望你能找到我。 –