Sql 如何订购项目和子项目?

Sql 如何订购项目和子项目?,sql,postgresql,select,sql-order-by,Sql,Postgresql,Select,Sql Order By,我有一张桌子: CREATE TABLE lc ( id CHARACTER(4), name TEXT ); “id”列在有项和子项的位置具有代码值,例如: 项目 分项: 101, 102, 201, 301 ... 1001, 1002, 1101 ... 其中,101为1的子项,201为2的子项,1001为10的子项,依此类推 我如何使用“订购方式”并获得以下订单: 1 101 102 2 201 ... 10 1001 1002 11 1101 ... 您可以使用以

我有一张桌子:

CREATE TABLE lc (
    id CHARACTER(4),
    name TEXT
);
“id”列在有项和子项的位置具有代码值,例如:

项目

分项:

101, 102, 201, 301 ... 1001, 1002, 1101 ...
其中,101为1的子项,201为2的子项,1001为10的子项,依此类推

我如何使用“订购方式”并获得以下订单:

1
101
102
2
201
...
10
1001
1002
11
1101
...
您可以使用以下选项:

select *
from lc
order by case when id::int < 100 then (id::int::text || '00')::int else id::int end
选择*
信用证
id::int<100然后按大小写顺序(id::int::text | | 00')::int else id::int end

但是,您的表格确实需要重新设计。

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

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

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

实际上,您应该更改表设计,并添加一个
parent
列,以避免出现这样的子项结构。在第11项之前,您一直在显示示例数据。有了更多的项目,我们将在某个时候到达项目101(它已经是项目10的子项目)。它的第一个子项目是10101。那会被放在101和102之间吗?例如,110101101102,…@juergend,因为是巴西器官的代码表@索斯滕克特纳:不!只有两个级别。。。10中的第一个是1001。我已经解决了!谢谢!啊,好的,我明白了。文档转到第40项,你认为它保证了永远不会到达第101项。我不能修改它,因为它是巴西某个机关的代码表,有这个标准。为什么
id::int::text
而不是
id
?@forpas-因为
字符(4)
用空格填充未使用的字符。
select * 
from mytable
order by length(num::text) % 2 desc, num::text;