【问题标题】:Need a query in Sqlalchemy with GROUP BY CASE需要在 Sqlalchemy 中使用 GROUP BY CASE 进行查询
【发布时间】:2014-03-11 15:37:24
【问题描述】:

我只需要一个简单的查询,比如 GROUP BY CASE

SELECT 
  COUNT([Personnel].[PERSONNEL_ID]) AS value,
  CASE 
    WHEN ([Personnel].[T_FIRSTNAME] = 'John') THEN 'John' 
    ELSE 'somethingelse' 
  END AS somelabel 
FROM [Personnel] 
GROUP BY 
  CASE 
    WHEN ([Personnel].[T_FIRSTNAME] = 'John') THEN 'John' 
    ELSE 'somethingelse' 
  END

在 Sqlalchemy 中,我的查询如下所示:

case_groups = case(
    [(HrPersonnel.T_FIRSTNAME=='John', 'John')],
    else_='somethingelse'
)

volunteers = session_mssql.query(
    func.count(HrPersonnel.S_HR_PERSONNEL_ID).label('value'),
    case_groups.label('somelabel'))\
    .group_by(case_groups)\
    .all()

mssql server 执行查询没有任何问题(engine.connect().execute(text_query))

但是 Sqlalchemy ORM 查询给了我一个错误。

文件 "c:\projects\sa_test\eggs\sqlalchemy-0.9.2-py2.7.egg\sqlalchemy\engine\default.py", 第 425 行,在 do_execute cursor.execute(statement, parameters) sqlalchemy.exc.ProgrammingError: (ProgrammingError) ('42000', "[42000] [Microsoft][ODBC SQL Server 驱动程序][SQL Server] 栏目 'Personnel.T_FIRSTNAME' 在选择列表中无效,因为它是 不包含在聚合函数或 GROUP BY 子句中。 (8120) (SQLExecDirectW); [42000] [微软][ODBC SQL 服务器 驱动程序][SQL Server]无法准备语句。 (8180)") u'SELECT count([Personnel].[PERSONNEL_ID]) 作为值,CASE WHEN ([人员].[T_FIRSTNAME] = ?) 那么?别的 ? END AS somelabel \nFROM [Personnel] GROUP BY CASE WHEN ([Personnel].[T_FIRSTNAME] = ?) THEN ? 别的 ? END' ('John', 'John', 'somethingelse', 'John', 'John', '别的东西')

为什么“Personnel.T_FIRSTNAME”在选择列表中无效?

欢迎提出任何建议。 谢谢,

【问题讨论】:

标签: sql-server sqlalchemy


【解决方案1】:

我本身没有答案(尽管未来的读者可能想在 SQLAlchemy Google Group 上查看this thread),但我最近遇到了类似的问题并找到了解决方法。

不是直接执行查询,而是将其转换为字符串并执行。例如:

session.execute(
    str(query.selectable.compile(compile_kwargs={'literal_binds': True}))
).fetchall()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    • 2017-02-24
    • 2013-01-27
    • 2019-01-06
    • 2012-05-18
    相关资源
    最近更新 更多