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
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! |