Postgres массив как вход функции для предложения where - PullRequest
0 голосов
/ 22 марта 2012

У меня есть таблица с VARCHAR в качестве PRIMARY_KEY, поэтому мои идентификаторы генерируются случайным образом и выглядят как WUoN5VemT или MQvOQidTi.Я просто хочу написать функцию, которая ожидает массив в качестве входных данных и возвращает все элементы, которые содержатся в массиве.Я думаю, что следующий полукод лучше покажет:

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;

Но проблема в том, что массив может содержать 50 или более записей (возможно также 100), поэтому мне нужно сделать это каккак можно быстрее.Следующая проблема заключается в том, что приведенный выше код не работает.Я часто находил решение для нескольких значений с помощью IN -ключа, но есть ли способ объединить массивы и IN -клаза?

Есть ли шанс реализовать это с помощью функции?

Ответы [ 2 ]

3 голосов
/ 22 марта 2012

Для массивов long он может заплатить за отмену и присоединиться к результирующему набору:

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 также подходит.

@ Клодоальдо уже дал несколько советов по STABLE и типу возврата. Моя демонстрация возвращает всю строку.

Не поверьте мне на слово. Запустите тест с EXPLAIN ANALYZE и, в идеале, сообщите о своих выводах. :)

1 голос
/ 22 марта 2012
SELECT * FROM "myTable" WHERE "id" = any($1) ORDER BY "idDate" DESC;

Эта функция стабильна, не является энергозависимой и возвращает таблицу или аналогичный не varchar.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...