首页 > 解决方案 > Sqlalchemy 最多 2 列

问题描述

我需要能够在sqlalchemy. 这 2 列可能来自 2 个不同的表。该操作的纯 SQL 模拟将是:

Select Id,
       Case When Col1 < Col2 Then Col1
            Else Col2
            End As TheMin
From   TableName

我一直在浏览文档,并没有找到一种直接的方法来做到这一点。这如何实现sqlalchemy

标签: pythonsqlsqlalchemy

解决方案


如果您使用的 RDBMS 支持函数GREATESTLEAST,您应该考虑使用它们,因为它们支持超过 2 列并正确处理NULL值。这些包括postgresqlmysql、 DB、 MariaDB 和 Oracle。

但是,如果您确实需要自定义 2 值比较,我建议您遵循官方文档中的“GREATEST”函数示例,这将允许您以通用方式使用该函数 - 如果引擎支持它,请使用 DB 级函数,以及自定义实现(sqlite、MS SQL 等)。

但是,您应该小心一个值为 NULL 的情况,这可能不会产生所需的结果。

无论如何,您关心的查询可以写成如下:

least_clause = (
    sa.case(
        [(ModelA.val < ModelB.val, ModelA.val)],
        else_=ModelB.val,
    )
)

# query
q = (
    session
    .query(
        least_clause.label("TheMin"),
        least(ModelA.val, ModelB.val).label("custom-least"),  # this is if you use custom function from linked example
        sa.func.least(ModelA.val, ModelB.val).label("builtin-least"),  # only support for build-int LEAST function
        ModelA,
        ModelB,
    )
    .select_from(ModelA)
    .outerjoin(ModelB, ModelA.key == ModelB.key)
)

推荐阅读