純粋な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[])))
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
、これを無視できます。