1

plpgsql で次のような関数を作成しようとしています:

CREATE OR REPLACE FUNCTION select_left_photo_ids(in_photo_id bigint[], in_album_id bigint, in_limit int) RETURNS SETOF bigint[] AS
$$
DECLARE photo_count int;
DECLARE photo_ids bigint[];
    BEGIN
        SELECT photo_id INTO STRICT photo_ids FROM tbl_album_photos WHERE album_id = in_album_id AND photo_id < in_photo_id ORDER BY photo_id DESC LIMIT in_limit;
        GET DIAGNOSTICS photo_count = ROW_COUNT;
        IF photo_count < in_limit THEN
            SELECT photo_id INTO STRICT photo_ids FROM (SELECT photo_id FROM tbl_album_photos WHERE album_id = in_album_id ORDER BY photo_id LIMIT in_limit) AS dummy ORDER BY photo_id DESC;
        END IF;
        RETURN photo_ids;
    END;
$$
LANGUAGE plpgsql;

アイデアは、入力写真 ID より大きい写真 ID をフェッチすることです。いいえ。結果の写真の数が制限未満であることが判明した場合、下位 n レコードを取得しようとします。

上記の機能は動作しません。選択クエリの結果を変数に格納する方法について、誰かがいくつかのポインタ/ヒントまたはリンクを教えてください。

注: photo_id はbigint[]データ型です。つまり、意図的にbigint[].

4

1 に答える 1

4

array_aggに追加する必要があります

  1. SELECT...INTO が機能するように、クエリから単一の値を取得します。
  2. そして、あなたのターゲットbigint[]に入れる結果を得てください。bigint[]

次に、LIMIT を機能させるために派生テーブルを追加する必要があります。

select array_agg(photo_id) into strict photo_ids
from (
    select photo_id
    from tbl_album_photos
    where album_id = in_album_id
      and photo_id < in_photo_id
    order by photo_id desc
    limit in_limit
) dt;

次に、ROW_COUNT を見る代わりに、配列の大きさを尋ねることができます。

photo_count := array_length(photo_ids, 1);

そして、次の SELECT...INTO は、array_agg上記の新しいバージョンに似ています。

于 2012-02-08T05:03:46.253 に答える