SQLite是否可以进行自然排序?

8
SQLite可以进行自然排序吗?例如,
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

我希望结果能够自然排序(比如说海牛,猴子)。SQLite没有类似的排序选项吗?因为我需要经常进行数据排序,如果SQLite无法自然排序,那么我想解决方案就是返回使用PostgreSQL或MySQL。

2个回答

13

你不必更改表格来改变排序规则:

SELECT name FROM animals ORDER BY name COLLATE NOCASE;

如果你需要更专业的排序,可以使用sqlite3_create_collation*函数系列注册自己的排序函数,然后使用COLLATE myCollationFunctionName


7

ORDER BY UPPER(name) 可以实现您想要的功能。

此外,您正在使用SQLite默认排序规则,这意味着比较是使用C的memcmp函数进行的,它比较字节。在这种情况下,M和m非常不同。您可以更改列以具有NOCASE排序规则。但是,查看文档后,似乎您需要创建一个新表,将数据复制到其中,删除旧表并重命名新表,因为ALTER TABLE命令只能重命名表或添加列。


不完全准确(它仍然排序为1、10、11、12、2、3等),但对于我正在处理的表格来说这是可行的。谢谢! - Mike
2
我希望SQLite能够完全支持ALTER语法,否则很烦人。 - colithium
@Mark:有些人确实认为自然排序(例如电影标题)很重要。如果您想了解如何在SQLite中进行数字排序的想法,请发布一个不同的问题,因为它的参数略有不同,会吸引那些比我更熟悉SQLite的人。 - Eric
1
不需要 ALTER,您可以直接在 SELECT 语句中指定排序规则。请参见下面的答案。 - laalto
1
@laalto:是的,但它仍然只能在每个查询的基础上工作,而不是在表级别上。 - Eric
4
对于在Android中使用SQLite的人,我想提一下,Android添加了COLLATE UNICODE,它可以正确地对像“ä”这样的变音符号进行排序,而UPPER()COLLATE NOCASE只适用于ASCII字符。 - Torsten Römer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接