读书人

oracle order by有关问题

发布时间: 2012-12-22 12:05:06 作者: rapoo

oracle order by问题
select t.name as 名称,
nvl(t.face, 0) as 面值
from st_order t group t by t.name,t.face
order by case
when v_orderby = 1 then
名称
when v_orderby = 2 then
面值
end


面值是number类型,名称是char ,这个面值排序有问题,to_char后排出来的不对,谁能帮解决一下
[解决办法]
什:似2排在12後面?

如果是,改下就可以了


...
order by
...
to_number(面值)
...


[解决办法]
order by 后面不能跟别名要跟字段名 而且你GROUP BY 后面怎么还有t.face
这个呢有点不明白你什么意思,你这个SQL写的就有些问题
[解决办法]
引用:
什:似2排在12後面?

如果是,改下就可以了

SQL code

...
order by
...
to_number(面值)
...




v_orderby 是存储过程传的参数,前台可以选择根据什么排序,有的是char类型,有的是number类型,用case when ..then ..end 语句他们排序的类型就必须一致才行,我to_char了一下排出来就不对,因为前面已经有char排的了,to_number执行不了
[解决办法]
引用:
order by 后面不能跟别名要跟字段名 而且你GROUP BY 后面怎么还有t.face
这个呢有点不明白你什么意思,你这个SQL写的就有些问题


我做的是一个统计,GROUP by t.face 是根据面值分组的,查询不同面值的数据
[解决办法]
引用:

order by 后面不能跟别名要跟字段名 而且你GROUP BY 后面怎么还有t.face
这个呢有点不明白你什么意思,你这个SQL写的就有些问题


我做的是一个统计,GROUP by t.face 是根据面值分组的,查询不同面值的数据


那你MIN就没有用了好像,
[解决办法]

SELECT * FROM scott.emp e ORDER BY CASE WHEN 1=1 THEN TO_NUMBER(e.empno) ELSE TO_NUMBER(e.ename) END ;

[解决办法]
引用:
引用:

order by 后面不能跟别名要跟字段名 而且你GROUP BY 后面怎么还有t.face
这个呢有点不明白你什么意思,你这个SQL写的就有些问题


我做的是一个统计,GROUP by t.face 是根据面值分组的,查询不同面值的数据


那你MIN就没有用了好像,



我现在关心的排序问题,一个是char 一个是nuber 类型,是不是order by类型必须一致才行,而且我直接把参数放在order by 后面的时候压根就关不了用,才用的case when
[解决办法]
引用:
SQL code

SELECT * FROM scott.emp e ORDER BY CASE WHEN 1=1 THEN TO_NUMBER(e.empno) ELSE TO_NUMBER(e.ename) END ;



把name 给to_number了就报无效数字错误了,这个行不通
[解决办法]
引用:

我现在关心的排序问题,一个是char 一个是nuber 类型,是不是order by类型必须一致才行,而且我直接把参数放在order by 后面的时候压根就关不了用,才用的case when


不要用case语句,用动态sql能解决问题,例如

declare
l_order varchar2(100) := 'name';
l_sqltxt varchar2(1000);
type name_table is table of varchar2(100);
type value_table is table of number;
l_nameTbl name_table;
l_valueTbl value_table;
begin
l_sqltxt := 'select t.name, nvl(t.face, 0) from st_order t group by t.name,t.face order by :1';
execute immediate l_sqltxt bulk collect into l_nameTbl, l_valueTbl using l_order;
end;

[解决办法]
引用:
引用:
我现在关心的排序问题,一个是char 一个是nuber 类型,是不是order by类型必须一致才行,而且我直接把参数放在order by 后面的时候压根就关不了用,才用的case when


不要用case语句,用动态sql能解决问题,例如


SQL code

declare
l_order varchar2(100) := 'name';
……

楼上有实验过么?这个明显是不行的,oracle不支持列名动态绑定。

读书人网 >oracle

热点推荐