我有一个 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/