我正在尝试编写一个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参数。在帮助之前做过这个的人可以吗?
由于
答案 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值,使数字有效地降序。