接受 id 并返回表的函数 - 如何为多个 id 调用它?

Posted

技术标签:

【中文标题】接受 id 并返回表的函数 - 如何为多个 id 调用它?【英文标题】:Function that takes id and returns the table - how to call it for multiple ids? 【发布时间】:2020-07-21 06:26:20 【问题描述】:

我有一个函数,它接受一个标量 id 值并返回表。假设它看起来像这样:

CREATE FUNCTION get_id(num int) 
RETURNS TABLE(num int, name text) AS 
$$
SELECT num, name FROM t1
WHERE num = $1
$$ LANGUAGE SQL;

对于示例表t1t2

CREATE TABLE t1(
    num int,
    name text);
    
INSERT INTO t1 VALUES 
    (1, 'a'),
    (2, 'b'),
    (3, 'c');

CREATE TABLE t2(
    num int,
    name text);
    
INSERT INTO t2 VALUES 
    (1, 'xxx'),
    (3, 'yyy'),
    (5, 'zzz');

我可以调用我的get_id函数如下:

SELECT * FROM get_id(1)

以表格形式获取结果。但现在我想为多个 id 调用它并将结果按行堆叠在一起。我尝试了以下方法:

SELECT get_id(num) FROM (
SELECT * FROM t2
INNER JOIN t1 USING(num)) AS foo;

但这会返回复合行。我明白了,效果实际上与在标量值上调用SELECT get_id(2) 相同。但现在我想使用我的函数来返回许多 id 的结果。是否可以?如果是这样,我该如何实现?

【问题讨论】:

好点,已更正 【参考方案1】:

这就是横向连接的用途:

SELECT t2.name, gi.*
FROM t2
  JOIN lateral get_id (t2.num) as gi on true

如果您不喜欢“假”连接条件on true,您也可以使用交叉连接,因为您的函数无论如何都只会返回一行:

SELECT t2.name, gi.*
FROM t2
  cross join lateral get_id (t2.num) as gi 

【讨论】:

以上是关于接受 id 并返回表的函数 - 如何为多个 id 调用它?的主要内容,如果未能解决你的问题,请参考以下文章

如何为多个模型提供连续的 ID?

如何为每个 id 生成一个字符串列表? [复制]

如何为丢失的资源建模权限?

如何为多个活动全局定义特定布局onclick函数

如何为 django 模板中的单个按钮的 for 循环中的按钮提供唯一 id?

如何为返回的 Set-Cookie 会话 ID 解析 HttpWebResponse.Headers.Keys