[SQL] bug in 9.2.2 ? subquery accepts wrong column name : upd
dynacom=# SELECT DISTINCT ON (qry.setid) qry.setid, qry.arragg[1:2] FROM (select distinct sst.setid,(array_agg(vsl.name) OVER (PARTITION BY sst.setid ORDER BY character_length(vsl.name))) as arragg FROM sissets sst, vessels vsl WHERE vsl.id=sst.vslid ORDER BY sst.setid) as qry WHERE array_length(qry.arragg,1)>1 AND qry.setid IN (SELECT setid from sis_oper_cons) ORDER BY qry.setid,array_length(qry.arragg,1); setid | arragg ---+-- 54 | {EQUZZZ,SAMZZZ} 55 | {"ZZZR","ZZZTRAVEL"} 81 | {"ZZZ SISTER","ZZZ DUMMY II"} (3 rows) however, there is not column setid in sis_oper_cons, dynacom=# SELECT setid from sis_oper_cons; ERROR: column "setid" does not exist LINE 1: SELECT setid from sis_oper_cons; ^ 9.2.2 Postgresql treats qry.setid IN (SELECT setid from sis_oper_cons) as true. However, making subquery look like (SELECT soc.setid from sis_oper_cons soc), as in dynacom=# SELECT DISTINCT ON (qry.setid) qry.setid, qry.arragg[1:2] FROM (select distinct sst.setid,(array_agg(vsl.name) OVER (PARTITION BY sst.setid ORDER BY character_length(vsl.name))) as arragg FROM sissets sst, vessels vsl WHERE vsl.id=sst.vslid ORDER BY sst.setid) as qry WHERE array_length(qry.arragg,1)>1 AND qry.setid NOT IN (SELECT soc.setid from sis_oper_cons soc) ORDER BY qry.setid,array_length(qry.arragg,1); ERROR: column soc.setid does not exist LINE 1: ...gth(qry.arragg,1)>1 AND qry.setid NOT IN (SELECT soc.setid ... ^ dynacom=# postgresql corerctly identifies and throws the error. - Achilleas Mantzios IT DEV IT DEPT Dynacom Tankers Mgmt -- Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-sql
Re: [SQL] bug in 9.2.2 ? subquery accepts wrong column name : upd
Achilleas Mantzios writes: > dynacom=# SELECT DISTINCT ON (qry.setid) qry.setid, qry.arragg[1:2] FROM > (select distinct sst.setid,(array_agg(vsl.name) OVER (PARTITION BY > sst.setid ORDER BY character_length(vsl.name))) as arragg > FROM sissets sst, vessels vsl WHERE vsl.id=sst.vslid ORDER BY > sst.setid) as qry > WHERE array_length(qry.arragg,1)>1 AND qry.setid IN (SELECT setid from > sis_oper_cons) ORDER BY qry.setid,array_length(qry.arragg,1); > [ works ] > however, there is not column setid in sis_oper_cons, If not, that's a perfectly legal outer reference to qry.setid. Probably not one of SQL's better design features, since it confuses people regularly; but it's required by spec to work like that. regards, tom lane -- Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-sql
[SQL] UPDATE query with variable number of OR conditions in WHERE
I am building an UPDATE query at run-time and one of the fields I want to include in the WHERE condition may repeat several times, I do not know how many. UPDATE table1 SET field1 = "some value" WHERE (field2 = value_1 OR field2 = value_2 OR .OR field2 = value_n) I build such a query using a programming language and, after that, I execute it. Is this a good approach to build such a query? Respectfully, Jorge Maldonado
Re: [SQL] UPDATE query with variable number of OR conditions in WHERE
Quoth jorgemal1...@gmail.com (JORGE MALDONADO): > > I am building an UPDATE query at run-time and one of the fields I want to > include in the WHERE condition may repeat several times, I do not know how > many. > > UPDATE table1 > SET field1 = "some value" > WHERE (field2 = value_1 OR field2 = value_2 OR .OR field2 = value_n) > > I build such a query using a programming language and, after that, I > execute it. Is this a good approach to build such a query? You can use IN for this: UPDATE table1 SET field1 = "some value" WHERE field2 IN (value_1, value_2, ...); Ben -- Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-sql
Re: [SQL] UPDATE query with variable number of OR conditions in WHERE
Ben Morrow writes: > Quoth jorgemal1...@gmail.com (JORGE MALDONADO): >> I am building an UPDATE query at run-time and one of the fields I want to >> include in the WHERE condition may repeat several times, I do not know how >> many. >> >> UPDATE table1 >> SET field1 = "some value" >> WHERE (field2 = value_1 OR field2 = value_2 OR .OR field2 = value_n) >> >> I build such a query using a programming language and, after that, I >> execute it. Is this a good approach to build such a query? > You can use IN for this: > UPDATE table1 > SET field1 = "some value" > WHERE field2 IN (value_1, value_2, ...); IN is definitely better style than a long chain of ORs. Another possibility is to use = ANY(ARRAY): UPDATE table1 SET field1 = "some value" WHERE field2 = ANY (ARRAY[value_1, value_2, ...]); This is not better than IN as-is (in particular, IN is SQL-standard and this is not), but it opens the door to treating the array of values as a single parameter: UPDATE table1 SET field1 = "some value" WHERE field2 = ANY ($1::int[]); (or text[], etc). Now you can build the array client-side and not need a new statement for each different number of comparison values. If you're not into prepared statements, this may not excite you, but some people find it to be a big deal. regards, tom lane -- Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-sql