【问题标题】:How to search/filter by unnest result?如何按未嵌套结果搜索/过滤?
【发布时间】:2021-10-14 23:00:43
【问题描述】:

我想在 ARRAY(TEXT) 中搜索/过滤(不区分大小写)(使用 PostgreSQL)。虽然我发现直接不可能,但有人建议可以使用 unnest 的解决方案,所以我开始了。

我使用的表格如下:

from sqlalchemy.dialects.postgresql import ARRAY
 
 
class CaseStudy(db.Model):  # type: ignore
    __tablename__ = "case_studies"
    id = db.Column(db.Integer, primary_key=True)
    ...
    solutions = db.Column(ARRAY(db.Text))
    ...

我可以用纯 SQL 做类似的事情(减去小写部分):
SELECT * FROM case_studies WHERE 'a' IN (select(unnest(case_studies.solutions)));

但我无法将其转换为 SQLAlchemy。我认为我得到的最接近的是
result = session.query(cls.id).filter('a' in func.unnest(cls.solutions))
(但我得到了NotImplementedError: Operator 'contains' is not supported on this expression

result = session.query(cls.id).filter("a" in select(func.unnest(cls.solutions)))
但后来我得到TypeError: argument of type 'Select' is not iterable

任何建议如何在 SQLAlchemy 中做到这一点?另外,如何将unnest的结果转为小写?

【问题讨论】:

    标签: python sql postgresql sqlalchemy


    【解决方案1】:

    我可以通过以下方式解决这个问题:

    result = session.query(cls.id).select_from(func.unnest(cls.solutions).alias("sols")).filter(column("sols").ilike(f"%a%"))
    

    如果有人发布更好的解决方案,我会重新接受答案。

    【讨论】:

      猜你喜欢
      • 2016-10-29
      • 2020-04-07
      • 2020-08-24
      • 1970-01-01
      • 2021-09-13
      • 2016-01-11
      • 2021-07-22
      • 2016-01-15
      相关资源
      最近更新 更多