在连续列上使用Order By

时间:2017-01-03 13:34:46

标签: oracle11g

我有一个要求,即必须将表中的某些列组合在一起以生成查询结果。示例查询如下所示:

SELECT COLUMN1 || '^' || COLUMN2 || '^' || DECODE(COLUMN3,'Y', 'YES', 'NO') || '^' || SUM(COLUMN4)
FROM MY_TABLE
GROUP BY COLUMN1, COLUMN2, DECODE(COLUMN3, 'Y', 'YES', 'NO');

我有一种情况,用户以前缀应用程序的逗号分隔顺序指定按位置的顺序。例如:1,2和列索引的不同组合,具体取决于用户输入。

我正在使用oracle 11g作为数据库。

我要求对用户传递的列号执行排序。例如:

SELECT COLUMN1 || '^' || COLUMN2 || '^' || DECODE(COLUMN3,'Y', 'YES', 'NO') || '^' || SUM(COLUMN4)
FROM MY_TABLE
GROUP BY COLUMN1, COLUMN2, DECODE(COLUMN3, 'Y', 'YES', 'NO')
ORDER BY 1, 2;  -----------<<< How should I be able to add the order by clause here dynamically

执行上述查询时出现以下错误:

Error starting at line 1 in command:
SELECT COLUMN1 || '^' || COLUMN2 || '^' || DECODE(COLUMN3,'Y', 'YES', 'NO') || '^' || SUM(COLUMN4)
FROM MY_TABLE
GROUP BY COLUMN1, COLUMN2, DECODE(COLUMN3, 'Y', 'YES', 'NO')
ORDER BY 1, 2
Error at Command Line:4 Column:16
Error report:
SQL Error: ORA-01785: ORDER BY item must be the number of a SELECT-list expression
01785. 00000 -  "ORDER BY item must be the number of a SELECT-list expression"

请有人可以指导我如何在此查询中添加订单!!!!!!

提前致谢!!!

1 个答案:

答案 0 :(得分:0)

您可以通过两种方式实现这一目标。

  1. 在您的订单中使用/ select的相同表达式。

    SELECT COLUMN1 || '^' || COLUMN2 || '^' || DECODE(COLUMN3,'Y', 'YES', 'NO') || '^' || SUM(COLUMN4)
    FROM MY_TABLE
    GROUP BY COLUMN1, COLUMN2, DECODE(COLUMN3, 'Y', 'YES', 'NO')
    ORDER BY COLUMN1 || '^' || COLUMN2 || '^' || DECODE(COLUMN3,'Y', 'YES', 'NO') || '^' || SUM(COLUMN4)
    ;
    
  2. 按计算名称或数字索引使用内部选择和顺序

    SELECT * FROM ( 
    SELECT COLUMN1 || '^' || COLUMN2 || '^' || DECODE(COLUMN3,'Y', 'YES', 'NO') || '^' || SUM(COLUMN4)
    FROM MY_TABLE
    GROUP BY COLUMN1, COLUMN2, DECODE(COLUMN3, 'Y', 'YES', 'NO'))
    ORDER BY 1