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)1に相当します。aIN(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[])))

1NULL処理には微妙な違いがあります。

SELECT '{NULL}'::int[] <@ ... -- that's an array with a single NULL element

常にを生成しFALSEます。

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

常にyield NULL

値を照会しない場合はNULL、これを無視できます。

于 2012-04-27T04:45:56.290 に答える