"
a = ANY(b_array)
等同于a
IN
(b_array的元素)
1。
因此,您可以使用in_()
方法。
我在使用PostgreSQL的所有年份中从未记得使用过a = ALL(b_array)
。你用过吗?
"
如果你正在处理一个数组列,并想要测试它是否包含该列中的给定元素(或给定数组的所有元素),那么你可以使用
PostgreSQL数组运算符@>
(
包含
)或更合适的反向兄弟
<@
(
被包含
)。
数组运算符的优点在于它们可以在数组列上支持
GIN索引(与
ANY
结构不同)。
你的SQL语句:
SELECT * FROM my_table WHERE 10000 = ANY (array_field);
(几乎)等价于
SELECT * FROM my_table WHERE 10000 <@ array_field;
根据SQLAlchemy手册中的
教程,您可以使用任何运算符。我不是SQLAlchemy的专家。
If you have come across an operator which really isn’t available, you
can always use the op()
method; this generates whatever
operator you need:
>>> print users.c.name.op('tiddlywinks')('foo') users.name tiddlywinks :name_1
加粗是我添加的。在SQLA中,您的语句可能如下所示:
s = select([my_table], array_field.op('@>')('ARRAY[10000]'))
或者使用PostgreSQL数组值的替代输入语法:
s = select([my_table], array_field.op('@>') (cast('{10000}', int[])))
1 NULL处理存在微妙差别:
SELECT '{NULL}'::int[] <@ ...
始终返回FALSE
。
SELECT NULL IN (...)
SELECT NULL = ANY (...)
SELECT NULL::int[] <@ ...
始终返回NULL
。
如果您不打算查询NULL
值,则可以忽略此项。
SELECT * FROM my_table WHERE 5 = ANY(array_field)
?我理解in_()
在这种情况下无法帮助...Session.query(MyTable).filter(MyTable.array_field.in_(?????)).all()
- Vitalii PonomarSELECT * FROM my_table WHERE [10000,200,600] = ANY (array_field);
- 这意味着如果列array_field
中存在[10000,200,600]
中的任何一个值,则选择该行? - Arup RakshitALL
数组比较器,请从Postgres方言中导入它(from sqlalchemy.dialects.postgresql import All
),并将其作为参数传递给Query
对象上的having()
方法:query.having(All(1, func.array_agg(Widget.id)))
完整文档在此处 - Josh