我有一个带有表的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' }
}
);
答案 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
加上名为docnum
和docnum1
的{{1}}的两个子字符串中提取所有列
docnum3
答案 2 :(得分:1)
由于@nwellnhof的答案就像魅力一样,我只是想为SQLite提供相应的语法,它不知道undefined
函数。
split_part()