1

VB.NET からデータ "to_timestamp" と "to_number" を変換して優れた結果を得た後、PostgreSQL が .NET から整数の配列でテーブル インデックスをクエリできるかどうか疑問に思っています。

たとえば、 で満たされた配列があり(1, 3, 5, 6, 9)ます。PostgreSQL がこれらのインデックスのデータを含む行を「odbc.reader」に返す可能性はありますか?
これは、現在のように 5 回ループしてクエリを実行するよりもはるかに高速です。

このようなもの:

SELECT myindexes, myname, myadress from mytable WHERE myindexes IS IN ARRAY 

これが可能な場合、単純なクエリはどのように見えるでしょうか?

4

1 に答える 1

2

それは可能です。

どれか

SELECT myindex, myname, myadress
FROM   mytable
WHERE  myindex = ANY ($my_array)

整数配列の例:

...
WHERE  myindex = ANY ('{1,3,5,6,9}'::int[])

詳細ANYはマニュアルに記載。

同じ目的でSQLIN()もあります。
現在の実装の PostgreSQl は、= ANY (array)実行前にそれを内部的に変換するため、おそらく少し遅くなります。


長いリストに参加する例(コメントによる):

JOIN to VALUES 式

WITH x(myindex) AS (
    VALUES
    (1),(3),(5),(6),(9)
    )
SELECT myindex, myname, myadress
FROM   mytable
JOIN   x USING (myindex)

この例ではCTEを使用しています (これはオプションであり、サブクエリでもかまいません)。そのためには、PostgreSQL 8.4 以降が必要です。
についてのマニュアルですVALUES

ネストされていない配列への結合

またはunnest()、配列とJOINそれへの可能性があります:

SELECT myindex, myname, myadress
FROM   mytable
JOIN  (SELECT unnest('{1,3,5,6,9}'::int[]) AS myindex) x USING (myindex)

これらの各方法は、値ごとに個別のクエリを実行するよりもパフォーマンスがはるかに優れています。

于 2013-01-05T14:06:36.070 に答える