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