我正在对SQLite中的歌曲进行排序(在Android上)。我想按以下顺序排列:
- 不区分大小写
- 以整数值为依据,在末尾带有前导数字。
- 没有标点符号(例如括号,句号,连字符,撇号)
我已经完成了1和2 (见下文)。然而,我无法弥补每个字符(除了字母,数字和空格之外)的位置,除非调用replace()
来代替每个字符。
是否有其他方法可以做到这一点,而不是调用replace()
约32次?
(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
1
。对于没有标点符号的字符串,这个差异将为 0。因此,您可以在order by
子句中使用这些差异。希望你能明白我的意思。 - Vamsi Prabhaladiff:1
,其他的为diff:0
,这怎么能满足我的需求呢? - Phrogz