在纯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)
a = ANY(b_array)
a
IN
(elements_of_b_array)
因此,您可以使用该in_()方法。
in_()
我不记得曾经使用a = ALL(b_array)PostgreSQL多年。你?
a = ALL(b_array)
如果您要处理 数组列, 并想测试该 列中 是否包含给定元素(或给定数组的所有元素),则可以利用PostgreSQL数组运算符 @>(contains)或更合适地利用反同级 <@(is contained by)。
@>
contains
<@
is contained by
数组运算符的优点是可以通过数组列上的 GIN索引 来支持它们(与ANY构造不同)。
ANY
您的SQL语句:
(几乎)等于1
SELECT * FROM my_table WHERE 10000 <@ array_field;
我不是SQLAlchemy的专家,但是根据SQLAlchemy手册中的教程,您可以使用任何运算符:
如果遇到确实不可用的运算符,则可以始终使用该 op() 方法。这将生成您需要的任何运算符: >>> print users.c.name.op('tiddlywinks')('foo') users.name tiddlywinks :name_1
如果遇到确实不可用的运算符,则可以始终使用该 op() 方法。这将生成您需要的任何运算符:
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。
FALSE
SELECT NULL IN (...) SELECT NULL = ANY (...) SELECT NULL::int[] <@ ...
总是屈服NULL。
NULL
如果您不打算查询NULL值,则可以忽略它。