在安卓中使用SQLite实现字母数字值的自然排序

6

我有一份以字母开头、数字结尾的名称列表,例如:-

ka1, ka10, ka 2, ka, sa2, sa1, sa10, p1a10, 1kb, p1a2, p1a11, p1a. 

我希望按照自然顺序对其进行排序,即:

1kb, ka, ka1, ka 2, ka10, p1a, p1a2, p1a10, p1a11, sa1, sa2, sa10. 

我看到的主要问题是没有文本和数字部分之间的分隔符,也有可能没有数字部分。

我在Android中使用sqlite,可以通过缓存游标数据来获取点并使用Java进行排序,但我正在使用(推荐使用)游标适配器。

请建议一个用于排序的查询,或者是否有一种方法可以在游标中应用排序?


请发布你到目前为止尝试过的代码。 - Prerak Sola
@SKBasha,请检查我的答案。 - Arun Shankar
3个回答

5

我尝试了以下查询来进行自然排序:

SELECT 
    item_no
FROM
    items
ORDER BY 
   LENGTH(item_no), item_no;

在Sqlite数据库中,它对我也起作用了。请参阅此链接以获取更多详细信息。


不是完美的,但是一种很好的干净的自然排序数字的方法。不确定字母和小数点,但肯定可以让像“202”这样的东西在“1001”之前显示出来。谢谢。 - Joshua Pinter

0

我建议使用正则表达式替换添加零,创建原始值和相应值的临时表,然后按照此链接进行排序:http://www.saltycrane.com/blog/2007/12/how-to-sort-table-by-columns-in-python/ 正则表达式提示:在最后一个字母后面添加尽可能多的零,但限制预测的最大数字的总位数。如果您需要帮助处理正则表达式,请提供有效和无效值的确切信息,以便我们可以提供帮助。 PS 如果想确保零出现在最后一位数字之前,请从末尾搜索字符


-1

更新

您可以使用不同的方法 - 下面列举了一些:

BIN 方式

SELECT 
tbl_column, 
BIN(tbl_column) AS binray_not_needed_column
FROM db_table
ORDER BY binray_not_needed_column ASC , tbl_column ASC

强制类型转换

SELECT 
tbl_column, 
CAST(tbl_column as SIGNED) AS casted_column
FROM db_table
ORDER BY casted_column ASC , tbl_column ASC

或者尝试以下解决方案:

如果您在 Google 上搜索,您会发现有很多解决方案, 当然,您也可以只是使用 PHP 中的 natsort() 函数, 但是在 MySQL 中实现自然排序也很简单:首先按长度排序,然后再按列值排序。

查询:SELECT alphanumeric, integer FROM sorting_test ORDER BY LENGTH(alphanumeric), alphanumeric 来自此处


这不会忽略空格,并且不能正确处理具有不同位数的值。 - CL.

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