2013-03-27 2 views
0

나는 postgres를 처음 사용하고 비트를 반환하는 함수를 설정하려고합니다.포스트그레스에서 비트를 반환하는 방법

나는

기능의 마지막 문이 SELECT이거나 RETURNING /삭제/업데이트 삽입해야 오류가 계속.

는 여기

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 $$ 

것을 이해 어디에서이 구문을 잘못 하겠어?

+0

내 업데이트 답변을 확인하십시오. –

답변

2

는 몇 가지 오류가 있습니다

  • DO가 함수 정의
  • 당신은 당신이 함수의 결과를 반환하는 return를 사용하여 PL/pgSQL의에서 언어
  • 의 사양을 누락에 잘못

귀하의 기능은 다음과 같습니다.

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를 사용한다 : 당신은 당신이 SQL에서 할 plpgsql 필요가없는 경우 a_horse의 대답으로 수행하지만 plpgsql 사용하려면

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

을 : 함수가 this question의 하나입니다

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

    select some_value = 1; 

$$ 
language sql; 

다음이 그것을 할 것입니다 :

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을 확인하는 것이 첫 번째 일치 항목을 찾는 것으로 충분하기 때문에 계산 속도가 훨씬 빠릅니다.

+0

더 좋지만, 난 이해하기 어려운 'someStuff' "요구 사항"이 더 복잡해질 것이라고 생각합니다. –

+0

@a_horse _someStuff_을 찾았다면 SQL 버전이 여전히 적합하다고 생각합니다. 업데이트를 참조하십시오. –

관련 문제