Есть ли способ иметь переменную в предложении ORDER BY объявления курсора? - PullRequest
0 голосов
/ 04 марта 2012

Я хотел бы иметь возможность использовать переменную параметра в порядке заказа объявления курсора. Я использую MySQL 5.5.21. Вот код, который я пытался использовать. Ошибок нет, но выходные данные не сортируются по столбцу, указанному в параметре.

CREATE PROCEDURE getData(IN start_id INT, IN end_id INT, IN col_sort VARCHAR(16), IN max_date DATE)
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE id_num INT;
    DECLARE rid_num LONG;
    DECLARE cur1 CURSOR FOR SELECT `ID`,`rid` FROM `clients` WHERE `rid` > 0 AND `date_live` < max_date ORDER BY col_sort LIMIT start_id, end_id;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN cur1;
(etc.)

Мне любопытно посмотреть, можно ли это сделать. Я бы не хотел определять несколько хранимых процедур для каждого возможного столбца. Заранее спасибо.

1 Ответ

4 голосов
/ 04 марта 2012

Выходные данные сортируются по введенному вами входному значению, то есть по строковому значению, которое фактически не сортируется вообще, поскольку все строки получают одинаковое значение.

Вам потребуется case для сортировки по различным столбцам:

order by case col_sort
  when 'col1' then col1
  when 'col2' then col2
  when 'col3' then col3
end

Это, конечно, требует, чтобы все столбцы были одного типа данных. Если у вас разные типы данных, вам нужен один case для каждого типа данных.

Другой альтернативой может быть создание SQL путем объединения строк, а затем выполнение этого.

...