我需要的只是一个简单的查询,如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'在选择列表中无效?
欢迎提出任何建议。 谢谢,
答案 0 :(得分:1)
我本身没有答案(虽然未来的读者可能想查看SQLAlchemy Google Group上的this thread),但我最近遇到了类似的问题并找到了解决方法。
不是直接执行查询,而是将其转换为字符串并执行该操作。例如:
session.execute(
str(query.selectable.compile(compile_kwargs={'literal_binds': True}))
).fetchall()