Sto ordinando brani in SQLite (su Android). Voglio ordinarli:ORDINA DI caratteri alfanumerici solo in SQLite
- Case-insensitive
- con la più cifre alla fine, dal valore intero.
- Senza punteggiatura (ad esempio parentesi, punti, trattini, apostrofi)
ho 1 & 2 lavora (vedi sotto). Tuttavia, non riesco a capire come sostituire ogni carattere (diverso da lettere, numeri e spazi) diverso dal chiamare replace()
per ogni carattere.
C'è un modo per fare questo oltre a ~ 32 chiamate a replace()
?
(valori ASCII 33-47,58-64,91-96,123-126)
Ecco una tabella di test. Il valore 'n' dovrebbe idealmente venire fuori in ordine. (No, non si può ordinare da 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');
Ecco la soluzione ad appena 1 & 2 di cui sopra:
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
Per questo test impostato produce risultati in questo ordine: 2,1,3,4,6,7,5,8,12,10,9,11,13,14,16,15,17,18,20,19,21,22,23,24
Posso risolvere questo particolare set di test con sostituzioni manuali per ogni carattere indesiderato:
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
Nel caso in cui sia utile, posso fare affidamento su SQLite 3.8.6 o superiore. Attualmente sto prendendo di mira solo Android L, e presto prenderò di mira Android M. – Phrogz
@ Phrogz..perché non provi a prendere la differenza tra la lunghezza della stringa originale e la lunghezza della stringa con la punteggiatura sostituita da '''' (stringa vuota) e "ordina" per quella differenza per il n. 3 nella domanda? –
non penso che tu mi abbia preso. Questo è quello che stavo cercando di trasmettere. per una stringa 'ab, c' sarebbe len (orig_string) è 4 e len (orig_string_with_punctuation sostituito da '') è 3. In questo modo si ottiene il diff come '1'. E per le stringhe senza punteggiatura questa diff sarebbe pari a 0. Quindi potresti usare queste differenze nella clausola 'order by'. spero che tu mi capisca –