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

How to generate Dynamic Order by clause in PL/SQL procedure?

我正在尝试编写一个 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 参数。以前做过的人可以帮忙吗?

谢谢

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

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 return NULL 没有 else 子句。

由于要求是基于数据类型的,所以你可以在你的解码中否定数字列;如果 col1 是数字,其他是文本,则:

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

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

所以 Gordon Linoff 对大小写的使用更好,您仍然可以用它取反 col1 值以使数字有效地降序排列。