9

在纯 postgres 中,我们可以这样写:

SELECT * FROM my_table WHERE 10000 = ANY (array_field);

或者

SELECT * FROM my_table WHERE 10000 = ALL (array_field);

如何在没有原始 sql 的 sqlalchemy 的帮助下做同样的事情?

4

1 回答 1

26

a = ANY(b_array)相当于1aIN(elements_of_b_array)

因此,您可以使用该in_()方法

我不记得a = ALL(b_array)在我所有的岁月里都使用过 PostgreSQL。你?


如果您正在处理一个数组列并想测试它是否包含该列中的给定元素(或给定数组的所有元素),那么您可以使用PostgreSQL 数组运算符 @>contains)或更合适的逆兄弟<@is contained by)。

数组运算符的优点是可以通过数组列上的GIN 索引ANY来支持它们(与构造不同)。

您的 SQL 语句:

SELECT * FROM my_table WHERE 10000 = ANY (array_field);

是(几乎)1相当于

SELECT * FROM my_table WHERE 10000 <@ array_field;

我不是 SQLAlchemy 专家,但根据SQLAlchemy 手册中的教程,您可以使用任何运算符:

如果你遇到一个确实不可用的运算符,你可以随时使用该op()方法;这会生成您需要的任何运算符:

>>> 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[] <@ ... -- that's an array with a single NULL element

总是产生FALSE

SELECT NULL IN (...)
SELECT NULL = ANY (...)
SELECT NULL::int[] <@ ...

总是屈服NULL

如果您不打算查询NULL值,则可以忽略它。

于 2012-04-27T04:45:56.290 回答