仅在SQLite中按字母数字字符排序

Phr*_*ogz 14 sql sqlite

我正在SQLite中排序歌曲(在Android上).我想订购它们:

  1. 不区分大小写
  2. 末尾带有前导数字,按整数值.
  3. 没有标点符号(例如括号,句点,连字符,撇号)

我有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');
Run Code Online (Sandbox Code Playgroud)

以下是上述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
Run Code Online (Sandbox Code Playgroud)

对于此测试集,它按以下顺序生成结果: 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
Run Code Online (Sandbox Code Playgroud)

Ste*_*ger 5

我会在表中添加一个名为"SortingName"的列.插入时计算此值,理想情况下不是在SQL中,而是在具有所有这些良好字符串操作的更高级语言中.

我不太了解这个数字.我想你能做的最简单的事情是在插入之前提取数字并将其放入另一列,如"SortingNumber".

然后简单地排序如下:

Order By
  SortingName,
  SortingNumber
Run Code Online (Sandbox Code Playgroud)

(或者反过来说.)

另一个优点是性能.您经常在编写数据时更频繁地读取数据.您甚至可以在这两个排序列上创建索引,如果在查询中计算它,通常是不可能的.