ric*_*ick 5 mysql sql stored-procedures
我正在创建一个存储过程,我正在动态地传递"订单",如下所示:
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
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我正在使用CONCAT将所有非VARCHAR字段转换为VARCHAR,因为混合可能的订单类型不起作用,如http://www.4guysfromrolla.com/webtech/010704-1.shtml所述.
我的问题是,现在按名称排序有效,但非字符串顺序返回为1,10,11,2,3,4,5,6,7,8,9.等等
有没有办法使用混合数据类型动态排序,仍然以正确的顺序返回整数,日期等.
解决方案是像这样动态地创建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 ;
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅此处:http://rpbouman.blogspot.com/2005/11/mysql-5-prepared-statement-syntax-and.html
归档时间: |
|
查看次数: |
5920 次 |
最近记录: |