Dav*_*ite 5 python oracle sqlalchemy oracle12c listagg
这是一个简单的 Oracle 表:
+-----------+---------+
| food | person |
+-----------+---------+
| pizza | Adam |
| pizza | Bob |
| pizza | Charles |
| ice cream | Donald |
| hamburger | Emma |
| hamburger | Frank |
+-----------+---------+
Run Code Online (Sandbox Code Playgroud)
这是我想做的聚合 SELECT 的结果:
+-----------+------------------+
| food | people |
+-----------+------------------+
| hamburger | Emma,Frank |
| ice cream | Donald |
| pizza | Adam,Bob,Charles |
+-----------+------------------+
Run Code Online (Sandbox Code Playgroud)
在 Oracle 11g+ 中,使用 LISTAGG 就很容易了:
SELECT food, LISTAGG (person, ',') WITHIN GROUP (ORDER BY person) AS people
FROM mytable
GROUP BY food;
Run Code Online (Sandbox Code Playgroud)
但是我一直无法在 SQLAlchemy 中找到一种方法来做到这一点。来自 Stack Overflow 的一个老问题显示有人试图实现自定义类来完成这项工作,但这真的是最好的选择吗?
MySQL 有一个group_concat特性,因此这个提问者用func.group_concat(...). 遗憾的是,该功能在 Oracle 中不可用。
从版本 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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2067 次 |
| 最近记录: |