Oracle:stragg和wm_concat以错误的顺序返回数据

时间:2014-02-04 19:44:23

标签: oracle

没有stragg我得到了14行的列表。当我引入straggwm_concat时,第一行的内容不会出现在列表的前面。我在我的应用程序中的许多地方使用stragg,现在我担心我可能无法获得预期的结果。

这是否可以在连接之前与数据列的宽度相关?

当我对数字列表使用stragg时,我得到的正是我所期望的,只有文字我才发现它不正确地排序数据。这是最令人不安的。它应该不相关,但我正在使用11g连接dll在TOAD中运行查询。

编辑: 当我将项目数量减少到前三个时,第一个项目位于列表的前面,当我添加第四个项目时,它将被推送到列表的末尾。随着其他项目的推出,它从最后一次飙升。我不希望stragg在此过程中改变列表的顺序。

1 个答案:

答案 0 :(得分:2)

stragg是用户定义的聚合函数。各种各样的人(Tom Kyte,Tim Hall和许多其他人)已经编写了该功能的各种版本。不知道你开始使用这些功能中的哪一个或者你对它做了哪些自定义,我将不得不推测一下。但是,一般情况下,这些函数没有进行任何类型的内部排序,因此值出现在列表中的顺序是任意的。函数今天返回一个订单,明天返回不同订单或者订单在不同会话中有所不同,这将是完全有效的。

各种人也编写了用户定义的聚合函数,它们按排序顺序返回数据列表。例如,加里迈尔斯有一个variant of the stragg function that sorts the elements alphabetically。您可以使用它并自定义函数,以按照您要排序的结果对结果进行排序。

但是,如果您使用的是Oracle 11.2或更高版本,那么使用LISTAGG analytic function会更好,这样可以更轻松地指定(或更改)数据排序方式。