如何使用ORDER by进行冒号分隔列在Oracle SQL中进行排序?

问题描述 投票:0回答:2

我有一个列在冒号分隔的例子2067:2063:2068:2066中有价值。现在我想以相同的顺序使用SQL查询来命令我的选择列表。这可能使用SQL吗?我通过id,name等了解ORDER,但这是一个不同的场景,因为它有值冒号分隔。有人可以建议需要做什么吗?

sql oracle sql-order-by
2个回答
1
投票

据我所知,您想要对数字列表进行排序(以冒号分隔)。这是什么? Apex穿梭物品或多个选择列表?

无论如何,看看这是否有帮助:

SQL> WITH test AS (SELECT '2067:2063:2068:2066' item FROM DUAL),
  2       gimme_rows
  3       AS (    SELECT REGEXP_SUBSTR (item,
  4                                     '[^:]+',
  5                                     1,
  6                                     LEVEL)
  7                         res
  8                 FROM test
  9           CONNECT BY LEVEL <= REGEXP_COUNT (item, ':') + 1)
 10  SELECT LISTAGG (res, ':') WITHIN GROUP (ORDER BY res) final_result
 11    FROM gimme_rows;

FINAL_RESULT
--------------------------------------------------------
2063:2066:2067:2068

SQL>

1
投票

数据库并不真正关心字符串中的内容,它将按字符串排序,而不管其中包含的内容。话虽这么说,糟糕的数据库设计会给你一些非常奇怪的结果。

如果你有一个像你一样的行和一行2068:2064:2069:2067,很明显我的例子将在你的例子中列出的那个之后。不那么明显的2068:2064:2065:2066会在你的例子之后,但在我之前。更令人困惑的是,这两个人如何订购像2069:2099这样的东西要难以预测。

根据您的用例说出什么是正确的行为甚至不是特别容易。数据库真的不应该包含像这样的listagg()值;我建议个人更好地存储数据。

© www.soinside.com 2019 - 2024. All rights reserved.