Re: A Table's Primary Key Listing - Mailing list pgsql-sql

From Roger Tannous
Subject Re: A Table's Primary Key Listing
Date
Msg-id 20050818203909.3979.qmail@web51906.mail.yahoo.com
Whole thread Raw
In response to Re: A Table's Primary Key Listing  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: A Table's Primary Key Listing
List pgsql-sql
Hi, 

If you put pg_index.indkey in the select statement, you'd notice that it's
sometimes 1 ( it's when we have one PK field) and sometimes 1 2 ( for two
PK fields), etc.

So I tried to use a replace command like the following:

(just to add parentheses, replace the space by a comma to use the
resulting string in an IN statement)

select '(' || replace('1 2', " ", ",") || ')';

which yields: (1,2)

But the following query fails to execute!!
select replace(indkey, " ", ",") from pg_index; 

[
sub question: Did I miss quotes around elements? I mean should I enclose
every element originating from the indkey array with single quotes ? if
yes, so easy, no need to matter about it: so I should have tried the
following (which I didn't have time to do yet):

select '(\'' || replace(indkey, " ", "','") || '\')' from pg_index;

Another issue here too: Could double quotes here be the source of a
problem ? So I should have tested also this query:

select '(\'' || replace(indkey, ' ', '\',\'') || '\')' from pg_index;

I expect this query to work :) Let's hope so!!
]



So we can use the following WHERE statement: 
WHERE pg_attribute.attnum IN '(' || replace('1 2', " ", ",") || ')'

which should translate into: WHERE pg_attribute.attnum IN (1,2)


Finally, this WHERE statement:

WHERE pg_attribute.attnum IN           '(\'' || replace(pg_index.indkey, " ", "','") || '\')'


[
Again, I should test:

WHERE pg_attribute.attnum IN           '(\'' || replace(pg_index.indkey, ' ', '\',\'') || '\')'

]


I wish I had database access in the internet cafe I'm sending this message
from :) instead of just loading you with this bunch of questions.


Best Regards,
Roger Tannous.


--- Tom Lane <tgl@sss.pgh.pa.us> wrote:

> "D'Arcy J.M. Cain" <darcy@druid.net> writes:
> > That's a good question.  The following query does this in a very
> > unsatisfactory way.  Anyone know what the general solution would be?
> 
> > ...
> >     (
> >       pg_index.indkey[0]=pg_attribute.attnum OR
> >       pg_index.indkey[1]=pg_attribute.attnum OR
> >       pg_index.indkey[2]=pg_attribute.attnum OR
> >       pg_index.indkey[3]=pg_attribute.attnum OR
> >       pg_index.indkey[4]=pg_attribute.attnum OR
> >       pg_index.indkey[5]=pg_attribute.attnum OR
> >       pg_index.indkey[6]=pg_attribute.attnum OR
> >       pg_index.indkey[7]=pg_attribute.attnum OR
> >       pg_index.indkey[8]=pg_attribute.attnum OR
> >       pg_index.indkey[9]=pg_attribute.attnum
> >     )
> 
> In CVS tip you could replace this with "attnum = ANY (indkey)".
> Unfortunately, most array support doesn't work on int2vector in
> pre-8.1 releases, so I think you're kinda stuck with the above
> for now.
> 
>             regards, tom lane
> 


    
____________________________________________________
Start your day with Yahoo! - make it your home page 
http://www.yahoo.com/r/hs 


pgsql-sql by date:

Previous
From: "Joel Fradkin"
Date:
Subject: nevermind answered my own question by looking at my question what a DOH!
Next
From: Roger Tannous
Date:
Subject: Re: A Table's Primary Key Listing