使用case()时如何解决错误“此表达式不支持运算符'getitem'”

发布于 2021-01-29 17:09:58

我正在尝试将以下SQL转换为SQLAlchemy:

select t1.id, t1.field_A,
    max(case when t2.field_B = 1 then t2.field_C end) test_2_field_b_1,
    max(case when t2.field_B = 2 then t2.field_C end) test_2_field_b_2
from test_1 t1
inner join test_2 t2 on t2.field_A = t1.field_A
group by t1.id, t1.field_A

我到目前为止:

qry = session.query(
    Test1.id_,
    Test2.field_A,
    func.max(case((Test2.field_B.__eq__(1), "Test2.field_C"))).label("test_2_field_b_1"),
    func.max(case((Test2.field_B.__eq__(2), "Test2.field_C"))).label("test_2_field_b_2"),
)
qry = qry.select_from(Test1)
qry = qry.join(Test2, Test2.field_A.__eq__(Test1.field_A))
qry = qry.group_by(Test1.id_, Test2.field_A)

但我收到以下错误:

NotImplementedError: Operator 'getitem' is not supported on this expression

在线上:

func.max(case((Test2.field_B.__eq__(1), "Test2.field_C"))).label("test_2_field_b_1"),

所以我不会让我发布整个回溯,因为它说代码太多了!

我要去哪里错了?

关注者
0
被浏览
155
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    case将when条件
    列表 作为其第一个参数,因此您需要相应地加上方括号:

    sa.case([(Model.column == value)])
    

    因此,您的代码应如下所示:

    qry = session.query(
        Test1.id_,
        Test2.field_A,
        sa.func.max(sa.case([(Test2.field_B == 1, "Test2.field_C")])).label("test_2_field_b_1"),
        sa.func.max(sa.case([(Test2.field_B == 2, "Test2.field_C")])).label("test_2_field_b_2"),
    )
    qry = qry.select_from(Test1)
    qry = qry.join(Test2, Test2.field_A == Test1.field_A)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看