如何订购物品和子物品?

时间:2019-01-02 19:55:30

标签: sql postgresql select sql-order-by

我有桌子:

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

“ id”列具有包含项和子项的代码值,例如:

物品

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

子项:

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

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

如何使用“排序依据”并具有以下顺序:

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

2 个答案:

答案 0 :(得分:1)

您可以使用此:

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

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

答案 1 :(得分: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;