Re: A Table's Primary Key Listing

From: Roger Tannous <roger77_lb(at)yahoo(dot)com>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, "D'Arcy J(dot)M(dot) Cain" <darcy(at)druid(dot)net>
Cc: Roger Tannous <roger77_lb(at)yahoo(dot)com>, pgsql-sql(at)postgresql(dot)org
Subject: Re: A Table's Primary Key Listing
Date: 2005-08-18 20:39:09
Message-ID: 20050818203909.3979.qmail@web51906.mail.yahoo.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: 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(at)sss(dot)pgh(dot)pa(dot)us> wrote:

> "D'Arcy J.M. Cain" <darcy(at)druid(dot)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

In response to

Responses

Browse pgsql-sql by date

  From Date Subject
Next Message Roger Tannous 2005-08-18 21:37:39 Re: A Table's Primary Key Listing
Previous Message Joel Fradkin 2005-08-18 20:38:36 nevermind answered my own question by looking at my question what a DOH!