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