perl - DBIx::Class:如何对列的多个子字符串进行排序?

标签 perl sorting dbix-class

我有一个 SQLite 数据库,其中的表和文档编号遵循以下架构:

16-145-45
16-127-30
16-141-42
16-122-14
15-090-04
15-089-15
15-089-05

我想按数字的第一部分和最后一部分对 ResultSet 进行排序,如下所示。首先,所有以最高两位数前缀 (16) 开头的文档按最后 2 位数字排序,然后与下一个 block 相同,依此类推。

16-145-45
16-141-42
16-127-30
16-122-14
15-089-15
15-089-05
15-090-04

有没有办法在DBIx::Class中使用某种自定义order_by子句来做到这一点,或者方法是什么?

我尝试了以下方法,但不起作用,因为数字的中间部分也被考虑进行排序:

my @rs = $self->search(undef,
    {
        order_by => { -desc => 'me.number' }
    }
);

最佳答案

如果你想让数据库对结果进行排序,你必须使用literal SQL .

这是 Postgres 的一个示例(我在反斜杠后面添加了一个空格来修复语法突出显示):

my @rs = $self->search(undef,
    {
        order_by => \ "split_part(number, '-', 1) || split_part(number, '-', 3) DESC",
    }
);

或者,通过使用 +select result set attribute 创建输出列:

my @rs = $self->search(undef,
    {
        '+select' => [
            { sort_key => \ "split_part(number, '-', 1) || split_part(number, '-', 3)" },
        ],
        '+as' => [ qw(sort_key) ],  # Make sort key accessible from DBIC.
        order_by => { -desc => 'sort_key' },
    }
);

另一种方法是检索整个未排序的结果集,并在客户端对其进行排序。 DBIC 没有任何特定功能可以帮助您完成此操作,因此只需使用 Perl 的 sort 函数即可。

关于perl - DBIx::Class:如何对列的多个子字符串进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40972303/

相关文章:

c# - 对字符串列表(门牌号)进行排序

jquery - 使用 jquery 对选择选项进行排序

perl - DBIx::Class has_many 连接列的子串

perl - 使用 Perl 的 DBIx::Class 并在大于列上进行选择

perl - Perl DBIx::Class 能否覆盖从数据库中检索列的方式?

Perl:代码差异

mysql - 在 perl/tk 上使用线程来避免窗口卡住/不响应

JavaScript:先按数字然后按字母对数组字符串进行排序

perl - 使用 Event::Lib 制作 perl 聊天客户端

regex - 如何将变量分配给正则表达式匹配结果