postgresql SQLAlchemy查询包含多个值中任意一个值的数组

luaexgnf  于 2023-03-08  发布在  PostgreSQL
关注(0)|答案(1)|浏览(283)

我想我可以在互联网上的某个地方找到这个问题的答案,但我似乎错过了。你可以查询一个表中的所有行,其中一个数组列包含一个特定的值:

MyModel.query.filter(Mymodel.arrayField.contains(['someValue'])

您可以输入多个值,这样数组必须包含所有指定的值:

MyModel.query.filter(Mymodel.arrayField.contains(['someValue', 'anotherValue'])

但是查询和数组包含至少一个指定值的情况如何呢?也就是说,查询将返回arrayField包含'someValue''anotherValue'的行,也可以同时包含'someValue''anotherValue',但不一定同时包含arrayField'anotherValue'
我该怎么做?

rt4zxlrg

rt4zxlrg1#

这里的Postgresql概念是overlapping数组,使用&&运算符实现:

test# SELECT ARRAY['a', 'x'] && ARRAY['a', 'b', 'c'] AS overlaps;
 overlaps 
══════════
 t
(1 row)

test# SELECT ARRAY['q', 'x'] && ARRAY['a', 'b', 'c'] AS overlaps;
 overlaps 
══════════
 f
(1 row)

SQLAlchemy在实现&&的Postgresql方言的ARRAY类型上提供了一个重叠方法。
检查至少包含'a''z'之一的列的ORM查询如下所示

session.query(MyModel).filter(MyModel.array_field.overlap(['a', 'z']))

或SQLAlchemy 2.0样式:

select(MyModel).where(MyModel.array_field.overlap(['a', 'z']))

或者,如果您更喜欢更接近Postgres语法:

select(MyModel).where(MyModel.array_field.op('&&')(['a', 'z']))

相关问题