如何根据传递给 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_1
和 Table_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
基于此
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_1
和 Table_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