Hi Sharon,

On 12/2/2014 12:32 AM, Sharon Tuttle wrote:
Quick question: did you perhaps try putting single quotes around the $1?

where id in '$1'

That also gives a syntax error: quoting the identifier results in a SQL string literal rather than a variable substitution.

According to SQL and the Postgresql manual, the syntax should be "... in ($1)" because IN takes a subquery or equivalent. However, working with various SQL libraries, I have found that the correct syntax can vary depending on how the library assembles the query. And, of course, libraries sometimes have gaps - but I have trouble believing that in this case because racket/db has around a long time and IN is standard SQL (from 1986).

Whatever the case, I can't figure out how to make IN work passing a list or array. From a bit of experimenting, it appears that in context of the IN clause, arguments can only be bound to single values: e.g., I can do

    (set! sql-cmd "select * from contacts where id in ($1,$2)" )
    (set! result (query db sql-cmd 42 101))

but I can't do

    (set! sql-cmd "select * from contacts where id in ($1)" )
    (set! result (query db sql-cmd  (list 42 101)))

=> query: cannot convert given value to SQL type
  given: '(14 20)
  type: int4
  expected: int32?
  dialect: PostgreSQL

I get the same error passing a pg-array.

However, if I convert the IN to "= ANY" then passing it a list or array works.

Maybe a bug?
George


...my experience is with Oracle SQL rather than Postgresql, and I haven't tried 
it from Racket, but it might be worth a try.

-- Sharon Tuttle

--
Sharon M. Tuttle, Professor
Department of Computer Science
Humboldt State University, Arcata, CA
[email protected]


On Nov 30, 2014, at 5:20 AM, George Neuner <[email protected]> wrote:

> Hi all,
>
> I'm using Postgresql 9.3.5 and I keep getting a syntax error trying to pass a list of 
identifiers to an "in" clause of a select.
>
>    (set! sql-cmd "select * from contacts where id in $1" )
>    (set! result (query db sql-cmd (list 42 101)))
>
> I've tried :
>    where id in $1
>    where id in ($1)
>    where id in (values $1)
>    where id in (values [$1])
>
> and also tried converting the list to a pg-array for the values clause.
>
>
> I have worked around it using "= any" and a pg-array, e.g.,
>
>    (set! sql-cmd "select * from contacts where id = any ($1)" )
>    (set! result (query db sql-cmd (list->pg-array (list 42 101))))
>
> but is there any way to actually use an "in" clause?
> Thanks,
> George
>
> ____________________
> Racket Users list:
> http://lists.racket-lang.org/users


____________________
 Racket Users list:
 http://lists.racket-lang.org/users

Reply via email to