使用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中的字母数字值进行自然排序的主要内容,如果未能解决你的问题,请参考以下文章
如何使用指定的语言环境对 sqlite3 中的文本进行排序?
怎样对android开发中的sqlite数据库进行模糊查询,并返回一个Cursor