Postgresql 如何基于传递给SQL函数的ID返回不同的表数据

Postgresql 如何基于传递给SQL函数的ID返回不同的表数据,postgresql,plpgsql,database-schema,dynamic-sql,sql-function,Postgresql,Plpgsql,Database Schema,Dynamic Sql,Sql Function,基于此,我想知道是否可以基于传递给函数的ID返回不同的表数据。 类似于(伪代码): Table_1和Table_2不共享相同的列,这会使上述返回子句无效。这在SQL函数中通常是不可能的。即使使用多态返回类型,实际返回类型也必须在调用时确定。但是SQL函数中的所有语句都是在函数执行之前规划的。因此,对于返回不符合返回类型的数据的SELECT语句之一,您总是会收到一条错误消息 PL/pgSQL函数中的动态SQL也可以实现同样的——但需要一些技巧: CREATE OR REPLACE FUNCTION

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


Table_1
Table_2
不共享相同的列,这会使上述
返回
子句无效。

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

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 = $1', pg_typeof(_tabletype))
   USING  _id;
END
$func$;
打电话(重要!):

“技巧”是将
null
值强制转换为所需的表类型,从而定义返回类型并从中选择要选择的表详细说明:

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

相关的:


好的,我将对每个表使用单独的函数。零件集合需要与返回的行格式匹配,对吗?在这个选择中有许多连接可能会使这个部分变得棘手,或者它是“可行的”?@Eunito:不能说,没有足够的信息。尝试一下,如果你遇到问题,你可能会问一个关于你遇到的问题的新问题。
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 = $1', pg_typeof(_tabletype))
   USING  _id;
END
$func$;
SELECT * FROM f_demo(null::schemaZ.Table_1, 1);