需要使用GROUP BY CASE在Sqlalchemy中进行查询

时间:2014-02-13 00:08:32

标签: sql-server sqlalchemy

我需要的只是一个简单的查询,如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:\项目\ sa_test \鸡蛋\ SQLAlchemy的-0.9.2-py2.7.egg \ SQLAlchemy的\发动机\ default.py”   第425行,在do_execute cursor.execute(语句,参数)中   sqlalchemy.exc.ProgrammingError :( ProgrammingError)('42000',“[42000]   [Microsoft] [ODBC SQL Server驱动程序] [SQL Server]列   “Personnel.T_FIRSTNAME”在选择列表中无效,因为它是   不包含在聚合函数或GROUP BY子句中。   (8120)(SQLExecDirectW); [42000] [Microsoft] [ODBC SQL Server   驱动程序] [SQL Server]语句无法准备。 (8180)“)   u'SELECT count([Personnel]。[PERSONNEL_ID])AS值,CASE WHEN   ([人员]。[T_FIRSTNAME] =?)那么? ELSE?结束一些标签\ nFROM   [人员] GROUP BY CASE WHEN([人员]。[T_FIRSTNAME] =?)那么?   ELSE?结束'('John','John','somethingelse','John','John',   'somethingelse')

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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