在纯 postgres 中,我们可以这样写:
SELECT * FROM my_table WHERE 10000 = ANY (array_field);
或者
SELECT * FROM my_table WHERE 10000 = ALL (array_field);
如何在没有原始 sql 的 sqlalchemy 的帮助下做同样的事情?
在纯 postgres 中,我们可以这样写:
SELECT * FROM my_table WHERE 10000 = ANY (array_field);
或者
SELECT * FROM my_table WHERE 10000 = ALL (array_field);
如何在没有原始 sql 的 sqlalchemy 的帮助下做同样的事情?
a = ANY(b_array)
相当于1。a
IN
(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
值,则可以忽略它。