Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按顺序排列的Oracle动态描述和ASC_Sql_Oracle - Fatal编程技术网

Sql 按顺序排列的Oracle动态描述和ASC

Sql 按顺序排列的Oracle动态描述和ASC,sql,oracle,Sql,Oracle,Order by是动态的,但排序顺序是静态的 SELECT ... Order By CASE WHEN InputParam = 'PRICE' THEN OFFER_PRICE END DESC, CASE WHEN InputParam = 'ENDING SOON' THEN EXPIRY_DATE END DESC, CASE WHEN InputParam = 'DISCOUNT' THEN DISC_PERCENTAGE END DESC,

Order by是动态的,但排序顺序是静态的

SELECT ...
Order By CASE WHEN InputParam = 'PRICE' THEN OFFER_PRICE END DESC,
         CASE WHEN InputParam = 'ENDING SOON' THEN EXPIRY_DATE END DESC, 
         CASE WHEN InputParam = 'DISCOUNT' THEN DISC_PERCENTAGE END DESC,
         CASE WHEN InputParam = 'SAVING' THEN SAVING END DESC

现在我需要确保排序顺序也是动态的。在上述查询中,是否有某种方法可以使排序顺序动态化?

如果您还想使排序顺序(ASC/DESC)动态化,可以执行以下操作:

SELECT ...
Order By CASE WHEN InputParam = 'PRICE' THEN l_so * OFFER_PRICE END,
         CASE WHEN InputParam = 'ENDING SOON' 
              THEN l_so * (SYSDATE - EXPIRY_DATE) END, 
         CASE WHEN InputParam = 'DISCOUNT' THEN l_so * DISC_PERCENTAGE END,
         CASE WHEN InputParam = 'SAVING' THEN l_so * SAVING END
使用变量
l\u so
,该变量包含1或-1,具体取决于所需的排序顺序。

这对我很有用:

order by 
  case when :dir_param = 'ASC' then
    case :col_param 
      when 'col_1_identifier' then col_1_name
      when 'col_2_identifier' then col_2_name
      ...
    end
  end,
  case when :dir_param = 'DSC' then
    case :col_param 
      when 'col_1_identifier' then col_1_name
      when 'col_2_identifier' then col_2_name
      ...
    end
  end desc


将文字、变量和列名替换为特定于您的情况的名称。Oracle似乎对desc sort direction限定符的位置非常挑剔。

expiration\u Date是datetime列。上述方法对此不起作用。@Aseem:您可以为日期顺序设置两个case(一个用于ASC,一个用于DESC),或者将日期转换为数字(天数)并使用变量选择正确的顺序。我已经完成了两个case逻辑,但SYSDATE-expiration\u date逻辑非常酷。谢谢
order by 
case when :dir_param = 'ASC' and :col_param = 'col_1_identifier' then col_1_name end,
case when :dir_param = 'DSC' and :col_param = 'col_1_identifier' then col_1_name end desc,
case when :dir_param = 'ASC' and :col_param = 'col_2_identifier' then col_2_name end,
case when :dir_param = 'DSC' and :col_param = 'col_2_identifier' then col_2_name end desc