mysql存储过程 - 按列索引排序

时间:2014-03-31 11:42:27

标签: mysql stored-procedures

我在mysql中编写了一个存储过程,我想在order-by-clause中使用列索引的参数。我尝试过以下方法:

CREATE PROCEDURE `testProc` (
  IN $sortColNum INT
)
BEGIN
SELECT id, title, date, sticky, published, created, updated, content
FROM news 
ORDER BY $sortColNum DESC;
END

存储过程不会抛出错误,但结果未排序。当我使用列索引作为预准备语句中的参数时,它工作正常。为什么它不能在存储过程中工作?

2 个答案:

答案 0 :(得分:1)

这不会奏效。您的$sortColNum被视为常量而非列引用。

你有两个选择。一种是使用prepare语句。另一种是在case语句中明确列出列:

order by (case $sortColNum
              when 1 then id
              when 2 then title
              when 3 then date
              when 4 then sticky
              . . .
          end)

此方法的缺点是所有值都转换为相同的数据类型(可能是字符串)。如果转换影响排序顺序,您可能希望自己进行显式转换。

答案 1 :(得分:1)

试试这个:

CREATE PROCEDURE `testProc`(IN sortColNum INT)
BEGIN
    SET @query = CONCAT ('SELECT id, title, date, sticky, published, created, updated, content
FROM news ORDER BY (',sortColNum,') DESC');
    PREPARE stmt FROM @query;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END
相关问题