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

时间:2016-12-05 10:40:31

标签: 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位数排序,然后与下一位数相同,依此类推。

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' }
    }
);

3 个答案:

答案 0 :(得分:2)

如果您希望数据库对结果进行排序,则必须使用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功能。

答案 1 :(得分:1)

您需要从结果集中提取其他列,这些列等于要排序的函数的值。然后,您可以将这些列放在order_by子句中,正常

这假设您的文档编号字段被称为docnum。它从Table加上名为docnumdocnum1的{​​{1}}的两个子字符串中提取所有列

docnum3

答案 2 :(得分:1)

由于@nwellnhof的答案就像魅力一样,我只是想为SQLite提供相应的语法,它不知道undefined函数。

split_part()