动态order by在存储过程mysql上不起作用

动态order by在存储过程mysql上不起作用,mysql,Mysql,我在MySQL中写了一个存储过程,是如何按特定列排序的,是动态的。用户可以为asc传递“asc”和为desc传递“desc”这样的值,然后我只能按该值排序。我已经用这个箱子订购了。但是当我执行存储过程时,它会给我一个错误 这是我编写的存储过程 DELIMITER $$ drop procedure if exists GETLATEST; DELIMITER $$ CREATE PROCEDURE GETLATEST( in `_limit_row` int(10), in `_order_b

我在MySQL中写了一个存储过程,是如何按特定列排序的,是动态的。用户可以为asc传递“asc”和为desc传递“desc”这样的值,然后我只能按该值排序。我已经用这个箱子订购了。但是当我执行存储过程时,它会给我一个错误

这是我编写的存储过程

DELIMITER $$
drop procedure if exists GETLATEST;

DELIMITER $$
CREATE PROCEDURE GETLATEST( in `_limit_row` int(10), in `_order_by` varchar(5))
BEGIN 
    set @limit_rows = `_limit_row`;
    set @orderby  = `_order_by`;
    (
        select ac.id as id,"sharepoint" as system_name ,al2.lct_name as lct_name, ac5.content_type_name as content_type_name, ac.createdat as published_date, ac.updatedat as updated_date, ac.createdat as sorting_date, ac.content_title as title, ac.content_downloadlink as downloadlink, ac.content_downloadable as downloadable, ac.content_filetype as file_type, ac.content_image  as image, ac.content_image_small as small_image, ac.content_introtext as intro_text, ac.content_longdesc  as long_description,
        null as thumbnail_image, null as lct_id, null as subtype, null as approved_date, null as title_acadia, null as document_number, null as target_audience, null as expiration_date, null as owner_name, null as major_version, null as minor_version,
        null as name
        from ap_content ac
        inner join ap_lct al2 
        on al2.id = ac.ap_lct_id
        inner join ap_contenttype ac5 
        on ac.ap_contenttype_id = ac5.id 
        where ac.id  in (
        select ac2.id from ap_content ac2 where ac2.createdat in (
                select max(ac3.createdat) from ap_content ac3 where ac3.ap_lct_id in (select al.id from ap_lct al where al.is_active = 1) and ac3.ap_contenttype_id in (select ac4.id from ap_contenttype ac4 where ac4.is_active = 1)  group by ac3.ap_lct_id 
          ) 
        )
    )
    union all 
    (
        
        select vd.document_id as id, "acadia" as system_name ,null as lct_name, null as content_type_name, null as published_date, null as updated_date,vd.approved_dt as sorting_date, null as title, null as downloadlink, null as downloadable, null as file_type,vd.image  as image, vd.image_sml as small_image,null as intro_text, null as long_description,
         vd.thumbnail_image  as thumbnail_image, vd.lct_id  as lct_id, vd.subtype  as subtype, vd.approved_dt  as approved_date, vd.title  as title_acadia, vd.document_number as document_number, vd.target_audience as target_audience, vd.expiration_date as expiration_date, vd.owner_name as owner_name,  vd.major_version_number as major_version, vd.minor_version_number as minor_version,
         vd.name  as name
        from veev_data vd where vd.document_id in (
            select vd2.document_id from veev_data vd2 where vd2.approved_dt in ( select max(vd3.approved_dt) from veev_data vd3 where vd3.lct_id in ( select vba.lct_id from veev_business_area vba where vba.is_active = 1) group by vd3.lct_id ) and vd2.status = 'Approved'
        )
        
    )
    order by sorting_date
    case @orderby 
        when 'asc' then asc
        when 'desc' then desc
    end
     limit `_limit_row`;
END$$
DELIMITER ;
这里我使用用户传递的值设置@orderby变量,如'asc'或'desc'。然后我用CASE来处理订单,就像这样

order by sorting_date
    case @orderby 
            when 'asc' then asc
            when 'desc' then desc
    end
    limit `_limit_row`;
当我尝试执行此过程时,会出现如下错误:

SQL错误[1064][42000]:您的SQL语法有错误;检查与您的MariaDB服务器版本相对应的手册,以了解第32行“case@orderby when'asc'然后是asc when'desc'然后是desc end limit`.\”附近使用的正确语法


如何按存储过程的输入参数中传递的特定顺序进行排序?

很抱歉。我已经编辑了我的问题@DaleKORDER,因为表达式是一个文本,而不是一个参数。极限表达式也是如此。使用动态SQL(准备好的语句)。@Akina应该为实体SQL查询使用case您可以按顺序使用case BY,例如,
case当``u ORDER`u BY`='asc',然后sorting`date ELSE TIMESTAMPDIFF(second,NOW(),sorting`u date)END
。您不能在LIMIT中使用CASE。我的列排序日期是固定的,但我需要根据CASE@Akina将ASC或DESC传递给它