如何在 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 值以使数字有效地降序排列。
我正在尝试编写一个 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 值以使数字有效地降序排列。