Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将PostgreSQL函数包装到另一个函数中,以有条件地合并结果_Sql_Postgresql_Function_Join_Plpgsql - Fatal编程技术网

将PostgreSQL函数包装到另一个函数中,以有条件地合并结果

将PostgreSQL函数包装到另一个函数中,以有条件地合并结果,sql,postgresql,function,join,plpgsql,Sql,Postgresql,Function,Join,Plpgsql,我有一个函数get_oversight(int),它返回一个列: person_id ---------- 100 101 102 103 104 以及另一个返回相同结构的函数get\u unfiltered\u responsibility(int): person_id ---------- 100 103 104 我需要第三个函数,它计算并返回上述函数的子集。下面是一些伪代码: def function get_responsibility(person_id int): ov

我有一个函数
get_oversight(int)
,它返回一个列:

person_id
----------
100
101
102
103
104
以及另一个返回相同结构的函数
get\u unfiltered\u responsibility(int)

person_id
----------
100
103
104
我需要第三个函数,它计算并返回上述函数的子集。下面是一些伪代码:

def function get_responsibility(person_id int):
    oversight = get_oversight(person_id)
    unfiltered_responsibility = get_responsibility(person_id)

    if number_of_records(unfiltered_responsibility) == 0:
        return oversight
    else
        return intersection(unfiltered_responsibility, oversight)
        # only ids from unfiltered_responsibility that are ALSO IN oversight

第三个函数是什么样子的?(使用v9.6)

假设两个函数都不会返回重复项。否则,你必须明确地定义如何处理这些问题

plpgsql函数中可以方便地使用特殊变量

仅在假设
get\u unfiltered\u responsibility()
始终返回
get\u oversibility()
的子集的情况下工作,就像示例数据所建议的那样。然后,如果联接没有返回任何行,我们可以得出结论,
get\u unfiltered\u responsibility()
为空

相关的:

或者,它被包装在一个简单的SQL函数中在任何情况下都可以工作,不管是不是子集(如果需要,也可以是一个plpgsql函数):

相关的:


DBFIDLE

该代码不是PL/pgSQLI将其描述为伪代码。。。我只是想描述一下我想要的逻辑。
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$;
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$;