#sql #perl #dbix-class
#sql #perl #dbix-class
Вопрос:
Я использую DBIx:: Class и у меня есть результирующий набор. Мне нравится изменять порядок результирующего набора. Мне нравится проверять конкретный столбец «Город» на соответствие списку исправленных значений («Лондон», «Нью-Йорк», «Токио») Если город найден в списке значений, я хотел бы переместить этот результат в верхнюю группу. Если город не найден, я хотел бы переместить этот результат в нижнюю группу в результирующем наборе.
Ответ №1:
ПОРЯДОК По выражению может быть тем, что вы ищете.
Например, вот таблица:
mysql> select * from test;
---- -----------
| id | name |
---- -----------
| 1 | London |
| 2 | Paris |
| 3 | Tokio |
| 4 | Rome |
| 5 | Amsterdam |
---- -----------
Здесь особый порядок:
mysql> select * from test order by name = 'London' desc,
name = 'Paris' desc,
name = 'Amsterdam' desc;
---- -----------
| id | name |
---- -----------
| 1 | London |
| 2 | Paris |
| 5 | Amsterdam |
| 3 | Tokio |
| 4 | Rome |
---- -----------
Перевод этого в метод результирующего набора:
$schema->resultset('Test')->search(
{},
{order_by => {-desc => q[name in ('London', 'New York', 'Tokyo')] }}
);
Комментарии:
1. С какой версией это работает? Это не работает с DBIx::Class 0.08123. Я также не видел никаких ссылок в SQL:: Abstract, но это может мало что значить.
2. Возможно ли создать дополнительное динамическое поле и выполнить order_by в новом поле?
3. Пример, добавленный daxim (спасибо за редактирование, кстати, мое последнее предложение было немного расплывчатым :), не совсем такой, каким он должен был быть. Вы можете указать ссылку на строку для параметра order_by, чтобы вы могли динамически создавать строку типа «name = ‘London’ desc, name = ‘Paris’ desc, name = ‘Tokyo’ desc»
4. База данных Oracle не принимает запрос, созданный таким образом. Oracle использует для этого ‘decode’. Есть ли обходной путь?
5. В Oracle вы можете использовать выражение ORDER BY CASE, описанное здесь : searchoracle.techtarget.com/answer/… (У меня нет установки Oracle, чтобы попробовать, извините)
Ответ №2:
Что-то вроде:
#!/usr/bin/env perl
use strict;
use warnings;
my $what = shift or die;
my @ary = qw(alpha beta gamma);
unshift(@ary,$what) unless ( grep(/$what/,@ary) );
print "@aryn";
1;
Запуск как:
./myscript omega
Комментарии:
1. Я ищу ответ dbic.