2012-03-21 25 views
0

VARCHARのテーブルをPRIMARY_KEYとしているので、私のIDはランダムに生成され、WUoN5VemTまたはMQvOQidTiのようになります。私はちょうど入力として配列を期待し、配列に含まれるすべての要素を返す関数を記述します。 where句の機能入力としてのPostgres配列

CREATE OR REPLACE FUNCTION public."getInfo" (
    "myIDs" varchar [] 
) 
RETURNS varchar AS 
$body$ 
BEGIN 

    SELECT * FROM "myTable" WHERE "id" IN($1) ORDER BY "idDate" DESC; 
    -- RETURN etc.... 

END; 
$body$ 
LANGUAGE 'plpgsql' 
VOLATILE 
CALLED ON NULL INPUT 
SECURITY INVOKER 
COST 100; 

しかし、問題は(100も可能である)の配列は、50個の以上のエントリを含めることができますので、私は早く、この操作を行う必要があります。私は、次の半のコードはずっといい、より良い、それを表示すると思います可能。次の問題は、上のコードは動作しません。私は多くの場合、 INキーワードを使って複数の値の解を見つけましたが、配列と INという節を組み合わせる方法はありますか?

これを実現する機会はありますか?

答えて

3

長いアレイのためには、ネスト解除し、得られたセットに参加するために支払うことができます。

@Clodoaldoは既にSTABLEと返品の種類に関する助言をしました。私のデモは行全体を返します。

私の言葉はパフォーマンスだけではありません。 EXPLAIN ANALYZEでテストを実行し、理想的にはあなたの調査結果を報告してください。 :)

+0

おかげで、私は「id_date DESC BYオーデル」を追加することにより、次のエラーを取得する: クエリに失敗しました:エラー:列「id_dateは、」GROUP BY句に表示される必要がありますまたは集約関数LINE 1で使用します: ... SELECT(SELECT COUNT(*)FROM "myTable" JOIN(SELECTネーム不一致($ 1))x(id) USING(id)ORDER BY "myTable"。 "id_date" DESC)CONTEXT:PL/pgSQL関数 "get_info"です。 テストの目的で、私はSELECT文の結果を数えます。これは後で置き換えられます... – Nrgyzer

+0

@Nrgyzer:機能を変更しました。あなたは 'count(*)'と 'ORDER BY id_date'を同時に使うことはできません。実際に達成したいことで質問を更新してください。 –

+0

ああ、大丈夫です...私はCOUNT(*)を削除しました。 – Nrgyzer

1
SELECT * FROM "myTable" WHERE "id" = any($1) ORDER BY "idDate" DESC; 

この関数は揮発性ではなく安定しており、varcharではなく、テーブルなどを返します。

CREATE OR REPLACE FUNCTION get_info(_ids varchar[]) 
RETURNS SETOF tbl AS 
$BODY$ 
    SELECT t.* 
    FROM unnest(_ids) id 
    JOIN tbl t USING (id) 
    ORDER BY id_date DESC; 
$BODY$ 
LANGUAGE sql STABLE; 

これはplpgsqlが機能することができるが、SQL関数は、ちょうど同様に機能する:

関連する問題