【发布时间】:2009-10-27 20:27:31
【问题描述】:
使用 Oracle 10.2.0。
我有一个包含行号、缩进级别和文本的表格。我需要编写一个例程来“自然”对缩进级别内的文本进行“自然”排序[即较低缩进级别的子级]。我在分析例程和连接之前/之前的经验有限,但从我在这里和其他地方读到的内容来看,似乎它们可以用来帮助我的事业,但我不知道如何。
CREATE TABLE t (ord NUMBER(5), indent NUMBER(3), text VARCHAR2(254));
INSERT INTO t (ord, indent, text) VALUES (10, 0, 'A');
INSERT INTO t (ord, indent, text) VALUES (20, 1, 'B');
INSERT INTO t (ord, indent, text) VALUES (30, 1, 'C');
INSERT INTO t (ord, indent, text) VALUES (40, 2, 'D');
INSERT INTO t (ord, indent, text) VALUES (50, 2, 'Z');
INSERT INTO t (ord, indent, text) VALUES (60, 2, 'E');
INSERT INTO t (ord, indent, text) VALUES (70, 1, 'F');
INSERT INTO t (ord, indent, text) VALUES (80, 2, 'H');
INSERT INTO t (ord, indent, text) VALUES (90, 2, 'G');
INSERT INTO t (ord, indent, text) VALUES (100, 3, 'J');
INSERT INTO t (ord, indent, text) VALUES (110, 3, 'H');
这个:
SELECT ord, indent, LPAD(' ', indent, ' ') || text txt FROM t;
...返回:
ORD INDENT TXT
---------- ---------- ----------------------------------------------
10 0 A
20 1 B
30 1 C
40 2 D
50 2 Z
60 2 E
70 1 F
80 2 H
90 2 G
100 3 J
110 3 H
已选择 11 行。
在我为您定义的情况下,我需要我的例程设置 ORD 60 = 50 和 ORD 50 = 60 [翻转它们],因为 E 在 D 之后和 Z 之前。
与 ORD 80 和 90 [其中 90 带 100 和 110 因为它们属于它] 相同,100 和 110。最终输出应该是:
ORD INDENT TXT
10 0 A
20 1 B
30 1 C
40 2 D
50 2 E
60 2 Z
70 1 F
80 2 G
90 3 H
100 3 J
110 2 H
结果是每个缩进级别按字母顺序排序,在其缩进级别内,在父缩进级别内。
【问题讨论】:
-
听起来像是我的家庭作业。
-
对于家庭作业来说似乎是硬编码,但谁知道呢?
-
这不是家庭作业。我已经大大简化了表格和数据,以专注于答案,而不是不相关的数据。
标签: sql oracle plsql oracle10g