我有一个包含以下4列的表格,其中包含一些示例数据
Aisle | Rack | Level | Position
1 1 1 1
1 2 1 2
2 1 1 1
2 2 1 1
2 3 1 1
3 1 1 1
3 2 1 1
我希望编写一个可以使用以下
对记录进行排序的查询首先由Aisle(升序)
然后通过Rack(上升为一个过道,下降为下一个和 等等。 。这是我似乎无法弄清楚它是否可以的部分 在Oracle中实现
然后按级别(升序)
然后按职位(升序)
因此得到的有序行如下
Aisle | Rack | Level | Position
1 1 1 1
1 2 1 2
2 3 1 1
2 2 1 1
2 1 1 1
3 1 1 1
3 2 1 1
我们按照条款
制定了以下命令order by aisle,
(case when mod(dense_rank() over (order by aisle), 2) = 1 then rack else - rack
end),
level,
position
但是,我收到错误" ORA-00932:不一致的数据类型:当我执行查询时,预期CHAR得到了NUMBER" 。列都是VARCHAR2类型。
我能做些什么才能让它发挥作用?
答案 0 :(得分:4)
如果列是varchar2()
,那么一元减号就不会那么好了。
相反怎么样?
order by aisle,
(case when mod(dense_rank() over (order by aisle), 2) = 1 then rack end) asc,
(case when mod(dense_rank() over (order by aisle), 2) = 0 then rack end) desc,
level,
position
答案 1 :(得分:0)
您可以按rack
,升序/降序排序,但如果您将rack
保留为varchar2
,那么9将按照升序排列在10之前(因为您按字母顺序排序,而不是按字母顺序排序,按字母顺序,字符1出现在9)之前。
除非这是预期的行为(它可能是,但它不常见),最好将rack
的所有出现包裹在to_number()
内,即按{{1}排序 - 无论是在您最初的尝试中(现在应该如何使用此修改)还是在Gordon的解决方案中 - 这可能会受到"字母顺序的影响"如果您不使用to_number(rack)
,则会出现问题。