Re: case statement as inline function?

From: CoL <col(at)mportal(dot)hu>
To: pgsql-general(at)postgresql(dot)org
Subject: Re: case statement as inline function?
Date: 2004-03-24 18:23:45
Message-ID: c3sjng$225l$1@news.hub.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

hi,

Mike Nolan wrote:

> Periodically I need to write a complex case statement that I'd like to
> be able to refer to in more than one place in a SQL command without having
> to make sure that each copy of the case statement remains the same as
> the query (to produce a mailing) is tailored.
>
> Is there any way to treat it like an inline function so that I could write
> something like the following (highly simplified):
>
> select case when A=1 then 1 when B=1 then 2 else null end
> as mailtype, memname from master
> where mailtype is not null;
>
> I could do it as a user function, though that would be less convenient during
> the specification phase, which may happen every few days. However, the
> columns referred to in the case statement can change too. Is there a way
> to pass the entire set of columns in a table to a function?

you can use array as parameter, than walk the array inside plpgsql, or
c, plperl ...

A simple plpgsql:
create or replace function _a(varchar[]) returns varchar as '
declare
t alias for $1;
i integer default 1;
s varchar default ''case when '';
begin
while t[i][1] <> '''' loop
s:=s||t[i][1];
if i%2<>0 then
s:=s||''='';
end if;
i:=i+1;
if t[i][1]<>'''' and i%2<>0 then
s:=s||'' then '';
end if;
end loop;
return s||'' end'';
end;
'language plpgsql immutable;

SELECT _a(ARRAY[['1'],['2'],['3'],['4']]);
_a
----------------------------
case when 1=2 then 3=4 end

this is not usefull for using in select in this case, just show, how to
work with array :)

C.

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Grace C. Unson 2004-03-24 18:30:03 Transaction Isolation Level
Previous Message Dustin Sallings 2004-03-24 18:09:08 Re: subversion vs cvs (Was: Re: linked list rewrite)