我想要输出中的等级顺序,但不知道如何?

时间:2018-10-20 10:28:01

标签: sql oracle

我希望在输出中按如下所示进行分层:

我的数据:

Name            | Cost   | Level 
----------------+--------+------
Car1            | 2000   |   1
 Component1.1   | 3000   |   2
  Component1.2  | 2300   |   3
Computer2       | 5000   |   1
 Component2.1   | 2000   |   2
  Component2.2  | Null   |   3

输出:显示所有包含货币的数据,并按级别对其进行排序,例如首先是1,然后是2,然后是3,然后再从1开始。

Name              | Level
------------------+------
Car1              |   1
 Component1.1     |   2
  Component1.2    |   3
Computer          |   1
 Component2.1     |   2

ORDER BY的作用是:

Name            | Level
----------------+------
Car1            |   1
Computer1       |   1
Component1.1    |   2
Component2.1    |   2
Component1.2    |   3
Component2.2    |   3 

我尝试了CONNECT BY PRIOR函数,但效果不佳

 SELECT Name, Level
   FROM Product
CONNECT BY PRIOR Level;

4 个答案:

答案 0 :(得分:0)

在MySQL中,您通常会使用“ order by”。因此,如果要在“行”表行上排序,则语法将如下所示:

SELECT * FROM items ORDER BY level ASC

您可以使用ASC(升序)或DESC(降序)。

希望这会对您有所帮助。

答案 1 :(得分:0)

您可以使用以下一个

SELECT Name, Level
FROM Auction
ORDER BY Name, Level
WHERE Money!='Null' ;

按名称进行排序将按层次结构顺序打印结果,但是如果它具有称为父ID的列,则显示起来会更容易。

答案 2 :(得分:0)

我为您建议:

SELECT Name, Level FROM Product ORDER BY Name, Level WHERE Money!='Null' ASC;

我希望这对你兄弟有帮助

答案 3 :(得分:0)

目前尚不清楚这是否是您真正期望的。从您的数据集中看来,您想根据组件末尾的某种版本号对组件进行数字排序。如果这确实是您想要的,则可以忽略名称和顺序中的非数字字符,而应使用纯数字,直到字符串的末尾(带有必需的where子句)。

ORDER BY REPLACE ( name, TRANSLATE(name,' .0123456789',' '),''); 

如果是这种情况,那么在level上也添加ORDER BY不会有任何区别,除非您的版本和级别的数字顺序是同步的。

如果您有诸如component2_name1.2之类的组件可能会破坏此逻辑,则可能会出现问题,为此您可能需要REGEXP来标识所需的模式。但是,从您的数据来看,情况似乎并非如此,我认为情况确实如此,您可能想弄清楚这是否不是您数据集中可能一直存在的内容。

这是为您的样本数据获得的结果的演示。

Demo

这将起作用,数字字符始终是有效的小数,并且只有一个小数点。如果您有复杂的版本控制系统,例如1.1.82.1.1等,则它需要在REPLACE ( name, TRANSLATE(name,' .0123456789',' '),'')之上进行复杂的排序。

您会在此类Here

之类的帖子中找到此类示例

注意 :我也请您阅读说明here,以了解如何提出一个好的问题。这样可以避免所有试图理解和回答您问题的人感到困惑。