sql - 将 PostgreSQL 函数包装在另一个函数中以有条件地组合结果

标签 sql postgresql function join plpgsql

我有一个返回单列的函数get_oversight(int):

person_id
----------
100
101
102
103
104

另一个函数get_unfiltered_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)

最佳答案

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

PL/pgSQL 函数中,您可以方便地使用特殊变量 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$;

fiddle

适用于 get_unfiltered_responsibility() 始终返回 get_oversight() 的子集的假设,就像您的示例数据似乎表明的那样。然后,如果连接没有返回任何行,我们可以得出结论:get_unfiltered_responsibility() 结果为空。

相关:

或者,这个 CTE包装在一个简单的 SQL 函数中,在任何情况下都可以工作,无论是否是子集(如果需要,也可以是 PL/pgSQL 函数):

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$;

fiddle

相关:

关于sql - 将 PostgreSQL 函数包装在另一个函数中以有条件地组合结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58054766/

相关文章:

SQL 按滚动日期加入

mysql - 如何检查sql中Where In子句中是否存在所有数组元素

sql - 仅对某些查询实现唯一约束

sql - 用于比较列中每个单词开头的索引

ios - 如何在 Xcode 中查看 View Controller 的代码 View ?

sql-server - 如果 SQL Server CASE 值为 NULL,则不返回任何内容

MySQL 使用 = 无法正确匹配电子邮件地址,但可以使用 LIKE

sql - 哪个 mysql select 更好/更快?

postgresql - Postgres 多列索引(整数、 bool 值和数组)

PHP 类具有来自 Traits 的冲突构造函数定义