【问题标题】:How do I return a single column in psotgres function?如何在 postgres 函数中返回单列?
【发布时间】:2021-11-22 10:21:15
【问题描述】:

所以,我有这个架构:

node_mapping(node_id: UUID, node_name: text, related_ids: jsonb)

我想为此查询编写一个 postgres 函数,以便在 Springboot 中的 JPA 方法中获得一个 List 作为输出。

select CAST(node_id AS VARCHAR) node_id from node_mapping where related_ids::jsonb? _seller_id = true;

我写了这个函数,但它不起作用,请帮助我。

CREATE OR REPLACE FUNCTION find_node_id(_relation_id text)
 RETURNS TABLE(node_id text) AS
 $func$
    BEGIN
        RETURN QUERY select CAST(node_id AS VARCHAR) node_id from node_mapping where related_ids::jsonb? _relation_id = true;
    END;
 $func$ LANGUAGE plpgsql;

请帮帮我,我做错了什么?

【问题讨论】:

  • 不工作是什么意思? stackoverflow.com/help/how-to-ask
  • 请记住披露您收到的下一个问题的逐字错误消息。并且始终是您的 Postgres 版本。

标签: postgresql spring-boot jpa stored-functions


【解决方案1】:

不清楚什么是“不起作用”,但我看到一个不明确的列引用“node_id”。通过表限定列名轻松修复:

CREATE OR REPLACE FUNCTION find_node_id(_relation_id text)
  RETURNS TABLE(node_id text)
  LANGUAGE plpgsql AS
$func$
BEGIN
   RETURN QUERY
   SELECT n.node_id::text    -- HERE!
   FROM   node_mapping n
   WHERE  n.related_ids ? _relation_id;
END
$func$;

请注意,RETURNS TABLE 声明中的 node_id 在整个函数体中作为 OUT 参数隐式可见。所以你需要在它和同名的列之间消除歧义。

相关:

我修复了其他一些奇怪的问题(不过,它们仍然可以工作)。除其他事项外,当列已键入 jsonb 时,您无需强制转换 related_ids::jsonb

最后的RETURN; 是可选的。 The manual:

最终的RETURN,应该没有参数,导致控制退出函数(或者你可以让控制到达函数的末尾)。

对于简单的示例,不如使用更简单的等效 SQL 函数

CREATE OR REPLACE FUNCTION find_node_id(_relation_id text)
  RETURNS TABLE(node_id text)
  LANGUAGE sql AS
$func$
SELECT n.node_id::text
FROM   node_mapping n
WHERE  n.related_ids ? _relation_id;
$func$;

或者,等价的:

CREATE OR REPLACE FUNCTION find_node_id(_relation_id text, OUT node_id text)
  RETURNS SETOF record
  LANGUAGE sql AS
$func$
SELECT n.node_id::text
FROM   node_mapping n
WHERE  n.related_ids ? _relation_id;
$func$;

【讨论】:

    猜你喜欢
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 2016-03-20
    相关资源
    最近更新 更多