当前位置: 首页 > 面试题库 >

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

易弘阔
2023-03-14
问题内容

我正在尝试将以下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"),

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

我要去哪里错了?


问题答案:

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)


 类似资料:
  • 问题内容: 我在做xpath搜索 这为我提供了Firebug中所需的第一类项目,但显然python不允许我将[1]添加到find函数中。有什么解决方法吗?搜索返回2个项目,我只想要一个。我要解决这个错误吗? 问题答案: 与大多数Selenium WebDriver绑定一样,如果仅指定“ element”,则将仅返回找到的第一个元素。但是,如果在方法中指定“元素”,它将返回找到的元素数组。 因此,您

  • 我正在尝试编译一个maven项目,即Java 8(JDK 1.8),当我运行以下命令时: 编译抛出以下错误 编译失败[ERROR] /C:/App.java:[16,35]lambda表达式在-source 1.5[ERROR]中不支持(使用-source 8或更高版本来启用lambda表达式) 怎么可能呢?在命令行mvn是用JAVA 8编译器设置的

  • 问题内容: 我有一个使用Spark的Java类。我需要从JavaRDD过滤出标头。这就是我要这样做的方式。 但是,此代码无法编译。IntelliJ IDE表示“此语言级别不支持Lambda表达式”。 问题答案: 您可以在Java 7上使用lambda,但涉及到一点点- 您必须使用Retrolambda之类的东西。 同样,您也可以在没有lambda的情况下执行相同的操作。Lambda可以通过匿名类轻

  • 显示错误根据标签文件中的TLD或属性指令,属性选择不接受任何表达式 其中,foo是在url中传递的参数,类似于

  • 使用表达式 例5.1 使用表达式 #!/usr/bin/python # Filename: expression.py length =5 breadth =2 area = length * breadth print'Area is', area print'Perimeter is', 2* (length + breadth) (源文件:code/expression.py) 输出 $

  • 我们将简单浏览一下运算符和它们的用法: 技巧 你可以交互地使用解释器来计算例子中给出的表达式。例如,为了测试表达式2 + 3,使用交互式的带提示符的Python解释器: >>> 2 + 3 5 >>> 3 * 5 15 >>> 表5.1 运算符与它们的用法 运算符 名称 说明 例子 + 加 两个对象相加 3 + 5得到8。'a' + 'b'得到'ab'。 - 减 得到负数或是一个数减去另一个数 -

  • 考虑以下片段: 在\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\一切工作完美,我得到打印出来的屏幕。 在中,我做了完全相同的操作,希望从参数包中读取。然而,我明白了 我做错了什么?人们会认为事情会完全一样,我只是替换了操作

  • 问题内容: 我正在尝试使用Diamond运算符,但是却收到以下消息: -source 1.5中不支持Diamond运算符(使用-source 7或更高版本来启用Diamond运算符) 它可以在Android的netbeans中修复吗? 问题答案: Android需要Java来源合规性5.0或6.0(Java5 / 6)。开箱即用不支持Java7。这些文章描述了有关如何使用某些Java7功能的技巧: