Re: Queyring for columns which are exist in table.

From: Sim Zacks <sim(at)compulab(dot)co(dot)il>
To: pgsql-general(at)postgresql(dot)org
Subject: Re: Queyring for columns which are exist in table.
Date: 2011-01-27 10:56:01
Message-ID: 4D414F41.1020804@compulab.co.il
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general pgsql-sql

On 01/27/2011 09:52 AM, Santosh Bhujbal (sabhujba) wrote:

> CREATE OR REPLACE FUNCTION ColumnAlreadyExists(name, name) RETURNS
> INTEGER AS E'
>
> DECLARE columnCount INTEGER;
>
> BEGIN
>
> SELECT COUNT (pg_attribute.attname) into columnCount FROM
> pg_attribute,pg_class, pg_type WHERE
> ((pg_attribute.attrelid=pg_class.oid) AND
> (pg_attribute.atttypid=pg_type.oid) AND (pg_class.relname = $1) AND
> (pg_attribute.attname = $2));
>
> IF columnCount = 0 THEN
>
> RETURN 0;
>
> END IF;
>
> RETURN 1;
>
> END;
>
> ' LANGUAGE 'plpgsql';
>
> DROP FUNCTION checkColumn(name,name,name);
>
> CREATE OR REPLACE FUNCTION checkColumn(name, name, name) RETURNS name
> AS E'
>
> DECLARE isColumnExist INTEGER;
>
> BEGIN
>
> SELECT ColumnAlreadyExists ($1,$2) into isColumnExist;
>
> IF isColumnExist = 0 THEN
>
> RETURN name($3);
>
> ELSE
>
> RETURN name($2);
>
> END IF;
>
> END;
>
> ' LANGUAGE 'plpgsql';
>
> Function checkColumn should return proper column name (second
> parameter) if column exist and third parameter if column not exist.
>
> NOW when I try to execute following command it returns improper result.
>
> I expect proper column values as a output of query.
>
> SELECT(checkColumn('tbl','c2','0'))::name FROM tbl;
>
> mydb=# SELECT (checkColumn('tbl','c2','0'))::name FROM tbl;
>
> checkcolumn
>
> -------------
>
> c2
>
> c2
>
> c2
>
> c2
>
> c2
>
> c2
>
> c2
>
> c2
>
> (8 rows)
>
> mydb=#
>
> Above query should return actual values present for c2 column in tbl.
>
> But it's not working as desired.
>
> Please help me in this.
>
> Thanks in advance,
>
> Santosh.
>
the name datatype won't cast it into a selectable column.
Forgetting about your function, if you try select 'c2'::name from tbl it
will also return c2 as a name datatype.
What you want to do is a dynamic query where you use execute or for row
in execute in a plpgsql function.

Also to see if the column exists, I would recommend using
information_schema.columns

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Arturo Perez 2011-01-27 12:32:15 Re: temporal period type and select distinct gives equality error
Previous Message Thom Brown 2011-01-27 10:08:31 Re: Queyring for columns which are exist in table.

Browse pgsql-sql by date

  From Date Subject
Next Message Sim Zacks 2011-01-27 14:15:37 Re: Queyring for columns which are exist in table.
Previous Message Jasen Betts 2011-01-27 10:20:06 Re: Compare the resulta of a count sql into bash