DBIx::Класс: Порядок результирующего набора, основанный на существовании значения в списке

#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.