如何在PL / SQL过程中生成Dynamic Order by子句?

时间:2015-03-13 23:39:18

标签: sql oracle plsql

我正在尝试编写一个PL / SQL过程,该过程将使用SQL查询来获取结果。但要求是order by可以是动态的,主要用于对屏幕中的列进行排序。我将2个参数传递给此过程 - in_sort_column和in_sort_order。 要求是在文本列上排序是在ASC中,对于数字,它是DESC。 我的查询看起来像这样,而不添加in_sort_order -

SELECT col1, col2, col3 from tabl e1 where col1 > 1000 
ORDER BY decode(in_sort_column,'col1', col1, 'col2', col2, 'col3', col3);

在这种情况下,我无法弄清楚如何使用in_sort_order参数。在帮助之前做过这个的人可以吗?

由于

2 个答案:

答案 0 :(得分:4)

进行动态排序时,我建议使用单独的子句:

order by (case when in_sort_column = 'col1' then col1 end),
         (case when in_sort_column = 'col2' then col2 end),
         (case when in_sort_column = 'col3' then col3 end)

如果列的类型不同,这可以保证您不会遇到类型转换的意外问题。请注意,case返回NULL而没有else子句。

答案 1 :(得分:3)

由于要求基于数据类型,您可以取消解码中的数字列;如果col1是数字,其他是文本,那么:

ORDER BY decode(in_sort_column, 'col1', -col1, 'col2', col2, 'col3', col3);

但是这将尝试将文本列转换为数字。您可以交换解码或周围以避免这种情况,但是然后您将数字列隐式转换为字符串,然后您的数字将按字母顺序排序 - 例如,2之后会出现2。

所以Gordon Linoff对案例的使用更好,你仍然可以否定col1值,使数字有效地降序。