【问题标题】:SQLite 3 Version Sort StringSQLite 3 版本排序字符串
【发布时间】:2015-04-01 14:54:23
【问题描述】:

这一定是一件简单的事情,但我什至在 Stackoverflow 上查看大量示例都无法弄清楚。

我有这个字符串序列,由 SQLite 选择生成:

SELECT sort FROM collections ORDER BY sort

1
10
11
14
15
2
3
4
5
6
6.12
6.7
6.7.13
6.7.8
9

但我需要按这个顺序(排序内容就像版本号):

1
2
3
4
5
6
6.7
6.7.8
6.7.13
6.12
9
10
11
14
15

请问,如何使用 SQLITE 3 选择执行此操作? 最好的问候

【问题讨论】:

  • 表定义中的排序是什么类型?在 sqlite shell 中检查.schema collections
  • 排序 = 表定义中的文本。我检查了你建议的链接。在我的情况下不起作用,因为我有级别......
  • 级别?哦,你在做版本排序。
  • 是的@Schwern。你能帮帮我吗?

标签: sorting sqlite tree


【解决方案1】:

SQL 中的版本排序并不容易。在 SQLite 中更难,因为它没有很多函数来进行字符串处理(没有拆分)。

如果没有太多数据,您可以使用检索数据的编程语言来完成。这是一个问题,因为它需要您将所有数据提取到内存中。

您可以提供自己的custom collation to SQLite。您如何执行此操作取决于您用于运行查询的编程语言和驱动程序。这是一个使用 Perl and DBD::SQLite 的示例。

use DBD::SQLite;
require version;

$DBD::SQLite::COLLATION{as_versions} = sub {
    my($a,$b) = @_;
    return version->parse($a) <=> version->parse($b);
};

my $dbh = DBI->connect(...);
my $sth = $dbh->prepare(q{
    SELECT sort
    FROM   collections
    ORDER BY sort COLLATE as_versions
});

最后,您可以将数据更改为更适合 SQLite 的形式。插入版本时,添加另一列,即版本转换为数字。这通常通过将每个部分转换为千分之一、百万分之一、十亿分之一等来完成。例如,“6.7.13”变为“6.007013”,“6.12”变为“6.012”。

【讨论】:

  • 谢谢@Schwern 差不多了,但我收到了这个:6.12 / 6.7 / 6.7.8 / 6.7.13 - 请注意 6.12 必须在 6.7.13 之后
  • @Britto 对不起,我误解了你的问题。我已更改我的答案以匹配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
  • 1970-01-01
  • 2021-11-21
  • 2011-12-10
  • 1970-01-01
相关资源
最近更新 更多