【问题标题】:How can I order item and subitem?如何订购商品和子商品?
【发布时间】:2019-05-29 10:58:00
【问题描述】:

我有桌子:

CREATE TABLE lc (
    id CHARACTER(4),
    name TEXT
);

“id”列在有item和subitem的地方有code值,例如:

物品

1, 2, 3 ... 10, 11 ...

子项目:

101, 102, 201, 301 ... 1001, 1002, 1101 ...

其中,101 是 1 的子项,201 是 2 的子项,1001 是 10 的子项,依此类推。

如何使用“Order By”并具有以下顺序:

1
101
102
2
201
...
10
1001
1002
11
1101
...

【问题讨论】:

  • 你真的应该改变你的表格设计并添加一个parent列以避免这种子项结构
  • 您正在显示直到项目 11 的样本数据。如果项目更多,我们将在某个时候到达项目 101(它已经是项目 10 的子项目)。它的第一个子项是 10101。那会放在 101 和 102 之间吗? IE。 1、101、10101、102、……?
  • @juergend,因为是巴西管风琴的代码表。 ovalleleao.com.br/Publicacoes/…
  • @ThorstenKettner 不!只有两个级别... 10中的第一个是1001。我已经解决了!谢谢!
  • 啊,好吧,我明白了。文档上升到第 40 项,您认为它保证永远不会到达第 101 项。

标签: sql postgresql select sql-order-by


【解决方案1】:

您的问题是有些项目是一位数(1、2 等),有些是两位数(10、11 等)。

您首先需要奇数位数(1 或 3 位数:1、2、101、102、201、...),然后是偶数位数(2 或 4 位数:10、11、1001、1002 , 1101, ...)。在这两个集合中,您需要文本顺序:在 '1' 之后但在 '2' 之前的 '101'。

select * 
from mytable
order by length(num::text) % 2 desc, num::text;

【讨论】:

    【解决方案2】:

    你可以用这个:

    select *
    from lc
    order by case when id::int < 100 then (id::int::text || '00')::int else id::int end
    

    但是,您的桌子确实需要重新设计。

    【讨论】:

    • 不能修改,因为是巴西管风琴的代码表,有这个标准。
    • 为什么是id::int::text 而不是id
    • @forpas - 因为character(4) 用空格填充未使用的字符。
    猜你喜欢
    • 2017-01-29
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 2010-10-09
    • 2016-08-19
    • 1970-01-01
    • 2018-09-20
    相关资源
    最近更新 更多