使用SQL中的Case进行动态排序

时间:2014-03-18 08:41:43

标签: sql oracle

如何基于Oracle sql中的参数获取动态Order,根据条件中的任何一个Dynamic Order by进行绑定,我的查询有什么问题请帮忙解决这个问题。参数值将动态传递对于用户。

SELECT actionstatus,
       id 
  FROM rdt_orderdetail
 WHERE id IN (45565,44033,45761,45543,45495,43472,42462,43477)

CASE WHEN ':user' = 'supplier THEN ORDER BY id 
  ELSE ORDER BY actionstatus
END

3 个答案:

答案 0 :(得分:4)

尝试这样的事情:

SELECT actionstatus,
       id 
 FROM rdt_orderdetail
 WHERE id IN (45565,44033,45761,45543,45495,43472,42462,43477)
 order by (CASE WHEN ':user' = 'supplier THEN id 
                                         ELSE actionstatus END)

Example fiddle

答案 1 :(得分:1)

您想使用动态订单吗?然后你将不得不使用动态SQL: - )

create or replace function GET_DETAILS(iField in varchar2) return sys_refcursor is
  aQuery varchar2(1000);
  aCursor SYS_REFCURSOR;
begin
  aQuery := 'select actionstatus,id from rdt_orderdetail
             where id in (45565,44033,45761,45543,45495,43472,42462,43477)
             order by ' || case iField when 'sup' then 'id' else 'actionstatus' end;
  open aCursor for aQuery;
  return aCursor;
end;
/

答案 2 :(得分:0)

您不能在CASE子句之外使用SELECT
此外'sup'总是等于'sup',所以无论如何它都没有。见到

关于整个逻辑 - 您对整个结果集进行排序,因此可以通过idactionstatus进行排序。您不能在id之前订购几行,而在actionstatus

订购下一行