我在存储过程中的代码:
SELECT * FROM
my_table ir
WHERE
--where clause goes here
ORDER BY
CASE WHEN p_order_by_field='Id' AND p_sort_order='ASC' THEN IR.ID end,
CASE WHEN p_order_by_field='Id' AND p_sort_order='DESC' THEN IR.ID end DESC,
CASE WHEN p_order_by_field='Date' AND p_sort_order='ASC' THEN TO_CHAR(IR.IDATE, 'MM/dd/yyyy') end,
CASE WHEN p_order_by_field='Date' AND p_sort_order='DESC' THEN TO_CHAR(IR.IDATE, 'MM/dd/yyyy') end DESC;
字符串
问题是排序是基于字符完成的,而对于日期情况来说是错误的。然而,CASE语句不允许除char之外的任何其他数据类型。那么,在这种情况下,解决方案是什么?我需要能够将p_order_by_字段传递到存储过程中。
2条答案
按热度按时间khbbv19g1#
应该很简单-只需在您的情况下使用ISO日期格式:
字符串
你应该没事
6jjcrrmo2#
另一个问题可能发生时,你想排序的日期差异(比方说天数之间的两天)。
例如,这样的排序将返回9(天)之前的数字13(天)。
解决方案是将日期差异的长度和差异本身连接起来:
字符串