I'd happily take a patch to the DBI docs to mention the common use case described by this thread.
Tim. On Tue, Apr 05, 2016 at 05:29:34PM +0000, Vaughan, Mark wrote: > This works if the number of elements remains static. You'd have to run the > prepare again if the number of elements changes. > > Mark Vaughan > Neustar, Inc. / Lead Consulting Services Consultant, Professional Services > 8532 Concord Center Drive, Englewood, CO 80112, USA > Office: +1.303.802.1308 Fax: +1.303.802.1350 / mark.vaug...@neustar.biz > > > -----Original Message----- > From: Paul DuBois [mailto:p...@snake.net] > Sent: Tuesday, April 05, 2016 11:25 AM > To: Bruce Ferrell <bferr...@baywinds.org> > Cc: dbi-users@perl.org > Subject: Re: suppress quoting in prepared sql > > > > On Apr 5, 2016, at 11:55 AM, Bruce Ferrell <bferr...@baywinds.org> wrote: > > > > Ick! > > > > ok, I have to dynamically build the IN clause of the prepare as a > > static sql statement > > Yep. This is how I do it for a given array of values: > > # Create a string of placeholder characters, with one ? character # per > element in an array of values. > > my @values = (1, 2, 3, 4, 5); > > my $str = join (",", ("?") x @values); > > Then interpolate $str into your query string. > > > > > On 4/5/16 9:32 AM, Vaughan, Mark wrote: > >> >From the DBI documentation > >> >(https://urldefense.proofpoint.com/v2/url?u=https-3A__metacpan.org_p > >> >od_DBI-23Placeholders-2Dand-2DBind-2DValues-29-3A&d=CwIF-g&c=MOptNlV > >> >tIETeDALC_lULrw&r=rwT9R07bCzfhX6apOj8NoPX-TbEkSSLuFkjri49xQ-0&m=QpMl > >> >4dk0ZSYHx2vhZSJDCeS1tdTQ9Z8GWCyZqgIjc28&s=2uZZNLLOkgh5xJfTn_SVli361r > >> >ZOaGOrDxGPv_yVwd8&e= > >> > >> Also, placeholders can only represent single scalar values. For example, > >> the following statement won't work as expected for more than one value: > >> > >> "SELECT name, age FROM people WHERE name IN (?)" # wrong > >> "SELECT name, age FROM people WHERE name IN (?,?)" # two names > >> > >> You may have to prepare the query each time unless you have a fixed number > >> of elements in the IN clause. > >> > >> HTH, > >> Mark Vaughan > >> Neustar, Inc. / Lead Consulting Services Consultant, Professional > >> Services > >> 8532 Concord Center Drive, Englewood, CO 80112, USA > >> Office: +1.303.802.1308 Fax: +1.303.802.1350 / > >> mark.vaug...@neustar.biz > >> > >> > >> -----Original Message----- > >> From: Bruce Ferrell [mailto:bferr...@baywinds.org] > >> Sent: Tuesday, April 05, 2016 10:24 AM > >> To: dbi-users@perl.org > >> Subject: suppress quoting in prepared sql > >> > >> I'm generating a sql statement like this: > >> > >> sth = $mysql_dbh->prepare( > >> "select sum(column) as columnSum from table where value in ( ? ) and > >> row_date between cast( ? as date) and cast( ? as date) "); > >> > >> sth->execute( $ValueIDs ,$week_start_date,$week_end_date); > >> > >> $ValueIDs is a series of unquoted values: > >> > >> 01161,01162,01262,01147,01034,01125,01125,01017,01125,01278,01204,011 > >> 64 > >> > >> When observed at the mysql server, the sql appears as follows: > >> > >> select sum(column) as columnSum where value in ( > >> '01161,01162,01262,01147,01034,01125,01125,01017,01125,01278,01204,01 > >> 164' ) and row_date between cast( '2016-03-29' as date) and cast( > >> '2016-04-05' as date) > >> > >> resulting in no data being returned. > >> > >> When the sql is manually entered as follows: > >> > >> select sum(column) as columnSum where value in ( > >> 01161,01162,01262,01147,01034,01125,01125,01017,01125,01278,01204,011 > >> 64 ) and row_date between cast( '2016-03-29' as date) and cast( > >> '2016-04-05' as date) > >> > >> The correct values are returned. > >> > >> How can I suppress the quoting for the IN clause? > >> > >> > > >