【问题标题】:How to run SELECT queries in PL/pgSQL IF statements如何在 PL/pgSQL IF 语句中运行 SELECT 查询
【发布时间】:2018-12-05 01:01:12
【问题描述】:

我正在尝试使用以下代码在 PL/pgSQL IF 语句中运行 SELECT 查询:

DO
$do$
DECLARE
    query_type   real;
    arr real[] := array[1];
BEGIN
    IF query_type = 1 THEN
        RETURN QUERY
        SELECT "Westminster".*
        FROM "Westminster"
        WHERE ("Westminster".intersects = false AND "Westminster".area <= 100);
    ELSE IF query_type = 0 THEN 
        RETURN QUERY
        SELECT "Westminster".*
        FROM "Westminster";
    END IF;
END
$do$

但是我收到以下错误,ERROR: cannot use RETURN QUERY in a non-SETOF function。

有谁知道我怎样才能让上面的代码工作?谢谢。

更新:这最终对我有用:

CREATE OR REPLACE FUNCTION my_function(query_type integer)
RETURNS SETOF "Westminster" LANGUAGE plpgsql as $$
BEGIN
    IF query_type = 1 THEN
        RETURN QUERY
        SELECT "Westminster".*
        FROM "Westminster"
        WHERE ("Westminster".intersects = false AND "Westminster".area <= 100);
    ELSIF query_type = 0 THEN 
        RETURN QUERY
        SELECT "Westminster".*
        FROM "Westminster";
    END IF;
END;
$$;

然后我这样调用函数:

SELECT * FROM my_function(1);

【问题讨论】:

  • 一个do 块不能返回任何东西

标签: postgresql if-statement select plpgsql


【解决方案1】:

来自the documentation:

代码块被视为没有参数的函数体,返回 void。

您只能在返回SETOF &lt;type&gt; 或TABLE(...) 的函数中使用RETURN QUERY。使用表 "Westminster" 作为结果类型,例如:

CREATE OR REPLACE FUNCTION my_function(query_type int)
RETURNS SETOF "Westminster" LANGUAGE plpgsql as $$
BEGIN
    IF query_type = 1 THEN
        RETURN QUERY
        SELECT "Westminster".*
        FROM "Westminster"
        WHERE ("Westminster".intersects = false AND "Westminster".area <= 100);
    ELSIF query_type = 0 THEN 
        RETURN QUERY
        SELECT "Westminster".*
        FROM "Westminster";
    END IF;
END;
$$;

-- exemplary use:

SELECT * FROM my_function(1); 

注意ELSIF的正确使用。

【讨论】:

  • 所以我创建了上面的函数并运行了 SELECT * FROM my_function();查询成功运行,但是它只返回标题而没有行条目。我自己运行了两个 SELECT 查询,它们返回行。有什么想法吗?
【解决方案2】:

我不认为anonymous code blocks 支持它。尝试创建一个函数并将其结果集定义为table,例如:

CREATE OR REPLACE FUNCTION myfunc() RETURNS TABLE (val INT) AS $$
BEGIN
  RETURN QUERY SELECT 1;
END;
$$ LANGUAGE plpgsql;

要调用你的函数,你可以使用:

SELECT * FROM myfunc();

注意:请记住,函数头上声明的表需要与RETURN QUERY 语句中返回的字段相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 2013-02-16
    • 2012-01-16
    • 2017-05-16
    • 1970-01-01
    相关资源
    最近更新 更多