Is there a way to use the the in_ operator on a case expression. The below is a contrived example but I am looking to do something like this.
I am able to define a hybrid_property along with an expression and that works but can I do this dynamically in a query?
# This does not work
class ReferralModel(Base):
id = Column(Integer, primary_key=True)
referrer_id = Column(Integer)
Session.query(ReferralModel.id).filter(case((ReferralModel.referrer_id.is_(None), -20), else_=ReferralModel.referrer_id).in_([-20, 10]))
referral table
id | referrer_id |
---|---|
10 | NULL |
20 | 10 |
SELECT *
FROM referral
WHERE CASE WHEN referrer_id IS NULL THEN -20 ELSE referrer_id END IN (-20, 10)
# This works
class ReferralModel(Base):
id = Column(Integer, primary_key=True)
referrer_id = Column(Integer)
@hybrid_property
def referrer_id_no_nulls(self) -> int:
return self.referrer_id if not self.referrer_id else -20
@referrer_id_no_nulls.expression
def referrer_id_no_nulls_expression(cls):
return case((cls.referrer_id.is_(None), -20), else_=cls.referrer_id)
Session.query(ReferralModel.id).filter(ReferralModel.referrer_id_no_nulls_expression.in_([-20, 10]))
New contributor
Python Dev is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.