如何根据传递给 SQL 函数的 ID return 不同的 table 数据

How to return diferent table data based on an ID passed to an SQL function

基于此 我想知道是否可以根据传递给函数的 ID return 不同的 table 数据。 类似于(伪代码):

CREATE FUNCTION schemaB.testFunc(p_id INT, select_param INT)
  RETURNS setof  schemaZ.Table_1
AS
$$
CASE
    WHEN select_param = 1 THEN SELECT * FROM schemaZ.Table_1 WHERE id = p_id
    WHEN select_param = 2 THEN SELECT * FROM schemaZ.Table_2 WHERE id = p_id
END;
$$
language sql;

Table_1Table_2 不共享相同的列,这使上述 RETURNS 子句无效。

通常无法使用 SQL 函数。即使使用多态 return 类型,实际的 return 类型也必须在调用时确定。但是 SQL 函数中的所有语句都是在函数执行之前计划好的。因此,对于 SELECT 语句之一 returning 不符合 return 类型的数据,您总是会得到一条错误消息。

同样的 可以 在 PL/pgSQL 函数 中使用动态 SQL 完成 - 使用一些技巧:

CREATE OR REPLACE FUNCTION f_demo(_tabletype anyelement, _id int)
  RETURNS SETOF anyelement LANGUAGE plpgsql AS
$func$
BEGIN
   RETURN QUERY EXECUTE
      format('SELECT * FROM %s WHERE id = ', pg_typeof(_tabletype))
   USING  _id;
END
$func$;

致电(重要!):

SELECT * FROM f_demo(null::schemaZ.Table_1, 1);

"trick"就是把一个null值转换成想要的table类型,从而定义return类型 选择 table 到 select。 详细解释:

  • Refactor a PL/pgSQL function to return the output of various SELECT queries

以此作为概念证明。通常,有更好(更安全、更少混淆、性能更高)的解决方案...

相关:

  • Difference between language sql and language plpgsql in PostgreSQL functions