Thread: 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
Quoth jorgemal1960@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
Ben Morrow <ben@morrow.me.uk> writes: > Quoth jorgemal1960@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