Oracle动态DESC和ASC按顺序排列

Ase*_*tam 8 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,
         CASE WHEN InputParam = 'SAVING' THEN SAVING END DESC
Run Code Online (Sandbox Code Playgroud)

现在我需要确保排序顺序也是动态的.有没有办法在上面的查询中使排序顺序动态化?

Vin*_*rat 16

如果您还想使排序顺序(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
Run Code Online (Sandbox Code Playgroud)

使用l_so包含1或-1 的变量,具体取决于您想要的排序顺序.


小智 9

这对我有用:

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
Run Code Online (Sandbox Code Playgroud)

要么

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
Run Code Online (Sandbox Code Playgroud)

将文字,变量和列名称替换为您的具体情况.Oracle似乎对desc排序方向限定符的位置非常挑剔.