数据库
首页 > 数据库> > python-SQLAlchemy中是否有LISTAGG WITHIN GROUP等效项?

python-SQLAlchemy中是否有LISTAGG WITHIN GROUP等效项?

作者:互联网

这是一个简单的Oracle表:

+-----------+---------+
|   food    | person  |
+-----------+---------+
| pizza     | Adam    |
| pizza     | Bob     |
| pizza     | Charles |
| ice cream | Donald  |
| hamburger | Emma    |
| hamburger | Frank   |
+-----------+---------+

这是我想执行的汇总SELECT的结果:

+-----------+------------------+
|   food    |      people      |
+-----------+------------------+
| hamburger | Emma,Frank       |
| ice cream | Donald           |
| pizza     | Adam,Bob,Charles |
+-----------+------------------+

使用Oracle 11g,使用LISTAGG可以轻松实现:

SELECT food, LISTAGG (person, ',') WITHIN GROUP (ORDER BY person) AS people
FROM mytable
GROUP BY food;

但是我还无法在SQLAlchemy中找到实现此目的的方法. old question from Stack Overflow显示某人在尝试实现自定义类来完成工作的位置,但这真的是最好的选择吗?

MySQL具有group_concat功能,因此this questioner通过func.group_concat(…)解决了他的问题.遗憾的是,该功能在Oracle中不可用.

解决方法:

version 1.1开始,您可以使用FunctionElement.within_group(*order_by)

In [7]: func.listagg(column('person'), ',').within_group(column('person'))
Out[7]: <sqlalchemy.sql.elements.WithinGroup object at 0x7f2870c83080>

In [8]: print(_.compile(dialect=oracle.dialect()))
listagg(person, :listagg_1) WITHIN GROUP (ORDER BY person)

标签:oracle12c,listagg,oracle,sqlalchemy,python
来源: https://codeday.me/bug/20191109/2012918.html