Oracle 排序依据 - 基于函数 (dense_rank)

Oracle Order by - Function Based (dense_rank)

我有一个 table,其中有以下 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 | 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 Clause

order by aisle,
      (case when mod(dense_rank() over (order by aisle), 2) = 1 then rack else - rack
       end),
      level,
      position

但是,我在执行查询时遇到错误 "ORA-00932: inconsistent datatypes: expected CHAR got 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、ascending/descending 排序,但如果您将 rack 保留为 varchar2,则 9 将按升序排在 10 之前(因为您正在排序按字母顺序,而不是数字,按字母顺序,字符 1 在 9 之前)。

除非这是预期的行为(它可能是,但不常见),最好将所有出现的 rack 包装在 to_number() 内,即按 to_number(rack) - 无论是在您最初的尝试中(现在应该可以进行此修改)还是在 Gordon 的解决方案中 - 如果您不使用 to_number().[= 可能会遇到 "alphabetical ordering" 问题17=]