Предполагая, что обе функции никогда не возвращают дубликаты.Иначе вам придется точно определить, как с ними обращаться.
В функции plpgsql вы можете удобно использовать специальную переменную FOUND
CREATE OR REPLACE FUNCTION get_combo_plpgsql(int)
RETURNS TABLE(person_id int) LANGUAGE plpgsql AS
$func$
BEGIN
RETURN QUERY
SELECT *
FROM get_oversight($1)
JOIN get_unfiltered_responsibility($1) USING (person_id);
IF NOT FOUND THEN
RETURN QUERY
SELECT * FROM get_oversight($1);
END IF;
END
$func$;
Этот только работает в предположении, что get_unfiltered_responsibility()
всегда возвращает подмножество get_oversight()
, как, по-видимому, и предполагают ваши данные выборки.Затем, если объединение не возвращает строк, мы можем заключить, что get_unfiltered_responsibility()
оказалось пустым.
Related:
В качестве альтернативы этот CTE , заключенный в простую функцию SQL , работает в любом случае, подмножество или нет(при необходимости также может быть функцией plpgsql):
CREATE OR REPLACE FUNCTION get_combo_sql(int)
RETURNS TABLE(person_id int) LANGUAGE sql AS
$func$
WITH cte AS (SELECT * FROM get_unfiltered_responsibility($1))
SELECT *
FROM get_oversight($1) o
WHERE EXISTS (
SELECT FROM cte
WHERE person_id = o.person_id
)
OR NOT EXISTS (TABLE cte)
$func$;
Связано:
дБ <> скрипка здесь