Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 基于函数的Oracle订单(密集等级)_Sql_Oracle_Oracle11g_Oracle10g - Fatal编程技术网

Sql 基于函数的Oracle订单(密集等级)

Sql 基于函数的Oracle订单(密集等级),sql,oracle,oracle11g,oracle10g,Sql,Oracle,Oracle11g,Oracle10g,我有一个表,其中包含以下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

我有一个表,其中包含以下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
我希望编写一个查询,可以使用以下方法对记录进行排序

  • 首先通过通道(上升)

  • 然后通过机架(上升一个通道,下降下一个通道和 所以,这是我似乎无法理解的部分 (在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 get NUMBER“。这些列都是VARCHAR2类型


我该怎么做才能让它工作

如果列是
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

您可以按
rack
、升序/降序排序,但如果将
rack
保留为
varchar2
,则9将以升序排在10之前(因为您是按字母顺序排序,而不是按数字顺序排序,并且按字母顺序,字符1排在9之前)


除非这是预期的行为(可能是,但不常见),否则最好将所有出现的
rack
包装在
to_number()
中,即,按
订购to_number(rack)
——无论是在您最初的尝试中(经过此修改后,现在应该可以工作了)或者在Gordon的解决方案中-如果您不使用
to_number()

非常感谢您,可能会遇到“字母顺序”问题。