使用android对sqlite中的字母数字值进行自然排序

Posted

技术标签:

【中文标题】使用android对sqlite中的字母数字值进行自然排序【英文标题】:Natural sorting of alphanumeric values in sqlite using android 【发布时间】:2016-08-05 18:14:09 【问题描述】:

我有一个以字符开头并以数字结尾的名称列表,例如:-

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进行排序,但我正在使用(推荐使用)游标适配器。

请提出一个排序查询,或者有什么方法可以在光标中应用排序?

【问题讨论】:

请贴出您目前尝试过的代码。 @SKBasha 检查我的答案 【参考方案1】:

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

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

它在 Sqlite 数据库中也对我有用。请参阅此link,了解更多详情。

【讨论】:

不是完美的,但是对数字进行自然排序的好方法。不确定字母和小数,但肯定会在“1001”之前出现“202”之类的东西。谢谢。【参考方案2】:

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

【讨论】:

【参考方案3】:

更新

您可以使用不同的方式 - 下面提到了一些:

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 来自 here

【讨论】:

这不会忽略空格,也不会正确处理不同位数的值。

以上是关于使用android对sqlite中的字母数字值进行自然排序的主要内容,如果未能解决你的问题,请参考以下文章

Android:SQLite 中的自定义排序规则

如何使用指定的语言环境对 sqlite3 中的文本进行排序?

怎样对android开发中的sqlite数据库进行模糊查询,并返回一个Cursor

用点、字母、数字对对象数组进行排序。我能够按数字排序,但混合值很困难。不确定是不是可以做对

Android排序sqlite查询结果忽略大小写

怎样对android开发中的sqlite数据库进行模糊查询,并返回一个Cursor