Ood*_*ini 27 python orm sqlalchemy
我正在使用SQLAlchemy和ORM paragdim.我无法找到一种方法来执行CASE WHEN指令.我在网上找不到这方面的信息.
可能吗 ?
van*_*van 44
请参阅文档页面上的sqlalchemy.sql.expression.case函数和更多示例.但它看起来像这样(逐字链接到文档):
case([(orderline.c.qty > 100, item.c.specialprice),
(orderline.c.qty > 10, item.c.bulkprice)
], else_=item.c.regularprice)
case(value=emp.c.type, whens={
'engineer': emp.c.salary * 1.1,
'manager': emp.c.salary * 3,
})
Run Code Online (Sandbox Code Playgroud)
编辑1 :( 回答评论)当然可以,见下面的例子:
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True, autoincrement=True)
first_name = Column(String)
last_name = Column(String)
xpr = case([(User.first_name != None, User.first_name + " " + User.last_name),],
else_ = User.last_name).label("full_name")
qry = session.query(User.id, xpr)
for _usr in qry:
print _usr.fullname
Run Code Online (Sandbox Code Playgroud)
另请参阅使用混合作为case混合属性中使用的示例.
在本例中,我让它与聚合函数一起使用func.sum
from sqlalchemy import func, case
my_case_stmt = case(
[
(MyTable.hit_type.in_(['easy', 'medium']), 1),
(MyTable.hit_type == 'hard', 3)
]
)
score = db.session.query(
func.sum(my_case_stmt)
).filter(
MyTable.success == 1
)
return score.scalar()
Run Code Online (Sandbox Code Playgroud)
我的表看起来像这样:
| hit_type | success |
-----------------------------
| easy | 1 |
| medium | 1 |
| easy | 0 |
| hard | 1 |
| easy | 0 |
| easy | 1 |
| medium | 1 |
| hard | 1 |
Run Code Online (Sandbox Code Playgroud)
score计算如下:
score = num_easy_hits + num_medium_hits + (3 * num_hard_hits)
4 次成功的简单/中度打击和 2 次成功的困难打击将为您提供(4 + (2*3)) = 10
| 归档时间: |
|
| 查看次数: |
21020 次 |
| 最近记录: |