Re: how to return 0 rows in function

From: Tomas Macek <macek(at)fortech(dot)cz>
To: pgsql-general(at)postgresql(dot)org
Subject: Re: how to return 0 rows in function
Date: 2007-05-18 10:56:50
Message-ID: alpine.LFD.0.99.0705181253250.12374@maca.fortech.cz
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Fri, 18 May 2007, Richard Huxton wrote:

> Tomas Macek wrote:
>> Hi, I have simplified function like this:
>>
>> ----------------
>> CREATE OR REPLACE FUNCTION f(varchar) RETURNS varchar AS $FUNC$
>> DECLARE
>> addr ALIAS FOR $1;
>> BEGIN
>> -- return NULL;
>> -- return '';
>> END
>> $FUNC$ LANGUAGE 'plpgsql';
>> -----------------
>>
>> This function is returning varchar and it always returns at least one row.
>> How can I make it to return 0 rows? Is it possible or not and how?
>
> It's not returning one row, it's returning a single scalar value (a varchar).
> SELECT f('x') will return one row, because a SELECT statement returns a set
> (well, actually a bag) of results.
>
>> Returning NULL does not help (return NULL string in 1 row). Not to return a
>> value leads to error output.
>
> If you want to return multiple results (in your case zero) you'll need to
> return a set of them:
>
> CREATE FUNCTION f2(varchar) RETURNS SETOF varchar AS $$
> DECLARE
> BEGIN
> IF $1 = 'a' THEN
> RETURN NEXT 'hello';
> END IF;
> RETURN;
> END
> $$ LANGUAGE plpgsql;
>
> SELECT * FROM f2('b');
> f2
> ----
> (0 rows)
>
> As you can see you need to call the function in set-returning context now.
>
> Does that help?

Thank you very much, that's what I was looking for. I'm newbie in postgres programming. I needed this function for Postfix, which complains to the maillog when the SQL query returns 1 row with zero-lenght string instead of 0 rows.

Best regards, Tomas

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Gerhard Wiesinger 2007-05-18 11:55:30 Tools for dumping pg_xlog, pg_clog, etc?
Previous Message filippo 2007-05-18 09:46:26 change database encoding without corrupting data (latin9 to utf8)