2

嗨,stackoverflow 成员,

我有一个紧迫的问题。

我目前正在开发一个带有GridView. GridView必须能够multi column动态执行排序。每当用户单击不同的列时,我的 C# 应用程序都会将列和排序顺序解析asc/desc到存储过程以执行记录检索。因此,我的 SP 必须能够动态处理输入。

我不希望使用动态 SQL,而是希望坚持使用 PL/SQL 查询。

这是我的代码示例,

SELECT ID,NAME FROM MY_TABLE WHERE ID='123' ORDER BY ID ASC, NAME DESC;

这部分,ORDER BY ID ASC, NAME DESC必须是动态的。我希望根据从我的应用程序传入的参数来制定这部分。

我目前正在处理 DECODE 函数和 CASE 函数,结果好坏参半,因为我只能处理 1 个参数输入。如果用户单击我的 GridView 上的多个列,我需要能够处理多列排序。

这部分应该是动态的并且能够处理多列排序。

ORDER BY ID ASC, NAME DESC, CLASS ASC... 等等等等 。

各位会员请指点我正确的方向。谢谢!

1)不希望使用动态sql并在PL/SQL中实现上述。

2)参数输入可定制,前端任何东西都可以。需要 SP 的帮助。

问候, TP

4

4 回答 4

4

您可以为此传递参数(@SortIndex)

ORDER BY 
CASE WHEN @SortIndex = 1 THEN ID END ASC,
CASE WHEN @SortIndex = 2 THEN NAME END DESC
CASE WHEN @SortIndex = 3 THEN Title END ASC 
于 2013-07-02T05:58:07.453 回答
0

它并不优雅,但它应该可以工作。提供一个代码并相应地排序:

ORDER BY CASE myparam 
         WHEN  1 THEN col1 ASC 
         WHEN -1 THEN col1 DESC
         WHEN  2 THEN col2 ASC 
         WHEN -2 THEN col2 ASC
         END;
于 2013-07-01T18:16:01.630 回答
0

通过

DECLARE @OrderBy VARCHAR(10)

DECLARE @ColumnName varchar(50) 

这两个参数作为存储过程的输入参数

尝试以下CASE条件:

ORDER BY CASE WHEN @OrderBy = 'ASC' THEN @ColumnName END ASC,
CASE WHEN @OrderBy = 'DESC' THEN @ColumnName END DESC
于 2013-07-01T10:36:00.177 回答
0

这应该让你朝着正确的方向前进:

CREATE OR REPLACE PROCEDURE GET_DETAILS (ORDER_TYPE1   IN VARCHAR2(5)
                         ORDER_TYPE2   IN VARCHAR2(5)
                                         ORDER_FIELD1 IN VARCHAR2(5) 
                                         ORDER_FIELD2  IN VARCHAR2(5)
                     V_ID         IN VARCHAR2(5)
                                         OUTPUT_DATA  OUT REF_CURSOR)
    IS
BEGIN 

OPEN OUTPUT_DATA FOR 
SELECT ID,NAME FROM MY_TABLE WHERE ID=V_ID ORDER BY ORDER_FIELD1 ORDER_TYPE1, ORDER_FIELD2 ORDER_TYPE2;

END GET_DETAILS;

ORDER_TYPE1、ORDER_TYPE2、ORDER_FIELD1 等是输入 此过程的输出将是您想要的记录集

于 2013-07-02T15:50:15.583 回答