динамический порядок хранимых процедур MySQL со смешанными типами - PullRequest
5 голосов
/ 25 августа 2011

Я создаю хранимую процедуру, в которую я передаю «заказ» динамически, например:

CREATE PROCEDURE `getStuff`(IN orderSQL VARCHAR(100))
BEGIN
    SELECT id, name, createdate
    FROM mytable
    ORDER BY
        CASE WHEN orderSQL='id_desc' THEN CONCAT(id, '') END DESC,
        CASE WHEN orderSQL='id_asc' THEN CONCAT(id, '') END ASC,
        CASE WHEN orderSQL='name_desc' THEN name END DESC,
        CASE WHEN orderSQL='name_asc' THEN name END ASC,
        CASE WHEN orderSQL='date_desc' THEN CONCAT(createdate, '') END DESC,
        CASE WHEN orderSQL='date_asc' THEN CONCAT(createdate, '') END ASC
END

Как вы можете видеть, я конвертирую все поля, не относящиеся к VARCHAR, в VARCHAR, используя CONCAT, потому что смешивание возможных типов заказов не работает, как описано здесь http://www.4guysfromrolla.com/webtech/010704-1.shtml.

Моя проблема в том, что теперь упорядочивание по имени работает, но не строковые порядки возвращаются как 1,10,11,2,3,4,5,6,7,8,9. и т.д.

Есть ли способ использовать смешанное динамическое упорядочение типов данных и при этом возвращать в правильном порядке для целых чисел, даты и т. Д.

Ответы [ 2 ]

5 голосов
/ 25 августа 2011

Решение состоит в том, чтобы создать полный SQL-оператор динамически, как это

DELIMITER $$

CREATE PROCEDURE GetStuff (IN orderSQL varchar(100) ) 
BEGIN

  DECLARE SQLStatement varchar(255);

  -- Enter the dynamic SQL statement into the
  -- variable @SQLStatement
  SET SQLStatement = CONCAT('SELECT id, name, createdate ',
                             'FROM mytable ',
                             'ORDER BY ',orderSQL);

  PREPARE stmt FROM SQLStatement;
  EXECUTE stmt;
END $$

DELIMITER ;

Смотрите здесь для получения дополнительной информации: http://rpbouman.blogspot.com/2005/11/mysql-5-prepared-statement-syntax-and.html

2 голосов
/ 25 августа 2011

Вы должны использовать подготовленные операторы для построения и выполнения пользовательского запроса или вы должны написать большое условие CASE для всех ваших запросов, т.е. -

  CASE orderSQL
    WHEN 'id_desc' THEN
      SELECT id, name, createdate FROM mytable ORDER BY id;
    WHEN 'id_desc' THEN
      SELECT id, name, createdate FROM mytable ORDER BY id_desc;
    ...
    ...
    ...
  END CASE;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...