我如何在postgres中返回一点

时间:2013-03-27 15:24:51

标签: postgresql

我是postgres的新手,并尝试设置一个返回一点的函数。

我一直收到错误

  

函数的final语句必须是SELECT或INSERT / UPDATE / DELETE   回来。

我理解

Unless the function is declared to return void, the last statement must be a SELECT, or an INSERT, UPDATE, or DELETE that has a RETURNING clause.

这是代码

CREATE OR REPLACE FUNCTION "f"(...)
  RETURNS bit AS
 DO $$
 Begin
        IF  someStuff
        THEN 
           0; //also tried select 0 //also tried return 0
        ELSE
           1;  //also tried select 1 //also tried return 0
        END IF;
        0; //also tried select 0 //also tried return 0
END $$

我的语法错在哪里?

2 个答案:

答案 0 :(得分:2)

有几个错误:

  • 函数定义中的DO错误
  • 您缺少语言规范
  • 在PL / pgSQL中,您使用return返回函数的结果

所以你的功能变成了:

CREATE OR REPLACE FUNCTION f(some_value integer)
  RETURNS bit AS
 $$
 Begin
    IF (some_value = 1)
    THEN 
       return 0; 
    ELSE
       return 1; 
    END IF;
END $$
language plpgsql

但是你应该使用boolean而不是bit来返回true / false标志:

CREATE OR REPLACE FUNCTION f(some_value integer)
  RETURNS boolean AS
 $$
 Begin
    IF (some_value = 1)
    THEN 
       return false; 
    ELSE
       return true; 
    END IF;
END $$
language plpgsql

答案 1 :(得分:1)

如果你想使用plpgsql,那么就像在a_horse的答案中一样,但如果你不需要在sql中执行plpgsql:

create or replace function f(some_value integer)
returns boolean as $$

    select some_value = 1;

$$
language sql;

如果该函数是来自this question的函数,则可以执行此操作:

create or replace function isPersonQualifiedForJob(pid integer, jid)
returns boolean as $$

    select exists (
        select 1
        from
            getskillsforjob(jid) j
            inner join
            getskillsforperson(pid) p on j.skillid = p.skillid
    )

$$
language sql;

检查exists比计算要快得多,因为它足以找到第一个匹配。