2009-07-04 5 views
7

Est-ce que SQLite peut trier naturellement? Par exemple,Est-ce que SQLite peut trier naturellement?

CREATE TABLE animals (
    id INTEGER NOT NULL PRIMARY KEY, 
    name TEXT NOT NULL 
); 

INSERT INTO animals (name) VALUES ('Monkey'); 
INSERT INTO animals (name) VALUES ('manatee'); 

SELECT name FROM animals ORDER BY name; 

name  
---------- 
Monkey  
manatee 

Je préférerais que les résultats soient triés naturellement (c'est-à-dire, lamantin, singe). Est-ce que SQLite n'a pas l'option de trier comme ça? Je trier beaucoup de données, et si SQLite ne peut pas trier naturellement, je suppose que la solution est de retourner à PostgreSQL ou à MySQL.

Répondre

7

ORDER BY UPPER(name) accomplira ce que vous cherchez.

En outre, vous utilisez le SQLite default collation, ce qui signifie que les comparaisons sont effectuées à l'aide de la fonction memcmp de C, qui compare les octets. Dans ce cas, M et m sont très différents. Vous pouvez modifier la colonne pour avoir un classement NOCASE. Cependant, en regardant par-dessus les documents, il apparaît que vous devrez créer une nouvelle table, y copier vos données, supprimer l'ancienne table et renommer la nouvelle, puisque la commande ALTER TABLE renomme uniquement la table ou ajoute une colonne.

+0

Pas exactement naturel (il trie toujours 1, 10, 11, 12, 2, 3, etc.), mais cela fonctionne pour la table avec laquelle je travaille. Merci! –

+2

Je souhaite que SQLite supporte pleinement la syntaxe ALTER, c'est très ennuyeux – colithium

+0

@Mark: Certaines personnes considèrent cette commande naturelle (par exemple, les titres de films). Si vous souhaitez obtenir des idées sur la façon de trier numériquement dans SQLite, posez une question différente, car les paramètres qui l'entourent sont un peu différents, et attireraient ceux qui sont plus familiers avec SQLite que moi. – Eric

11

Vous ne devez pas alter la table pour changer la collation:

SELECT name FROM animals ORDER BY name COLLATE NOCASE; 

Si vous avez besoin de tri plus spécialisé, vous pouvez enregistrer vos propres fonctions de classement avec la famille sqlite3_create_collation* des fonctions puis utilisez COLLATE myCollationFunctionName.

Questions connexes