From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
---|---|
To: | Ben Morrow <ben(at)morrow(dot)me(dot)uk> |
Cc: | jorgemal1960(at)gmail(dot)com, pgsql-sql(at)postgresql(dot)org |
Subject: | Re: UPDATE query with variable number of OR conditions in WHERE |
Date: | 2013-03-15 03:15:17 |
Message-ID: | 19955.1363317317@sss.pgh.pa.us |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-sql |
Ben Morrow <ben(at)morrow(dot)me(dot)uk> writes:
> Quoth jorgemal1960(at)gmail(dot)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
From | Date | Subject | |
---|---|---|---|
Next Message | Achilleas Mantzios | 2013-03-15 07:49:36 | Re: bug in 9.2.2 ? subquery accepts wrong column name : upd |
Previous Message | Ben Morrow | 2013-03-14 23:58:11 | Re: UPDATE query with variable number of OR conditions in WHERE |