如何在NOT IN语句中使用Postgresql ANY运算符

时间:2014-11-17 05:48:10

标签: python postgresql psycopg2

使用Pyscopg2,如何将Python列表传递给SQL语句using the ANY Operator

正常工作SQL读取(See SQL Fiddle):

SELECT * FROM student WHERE id NOT IN (3);

使用Psycopg2如下:

Psycopg2:查询1

以下查询未通过psycopg2.ProgrammingError: syntax error at or near "ANY"

id_list = [2,3,4]
cursor.execute("SELECT * FROM student WHERE id NOT IN ANY(%s)) %(id_list); 

Psycopg2:查询2

下面的查询不会抛出错误,但会产生错误的结果,因为它不会排除列表中的ID。它的行为就像它的Equal To运算符一样,或者像IN NOT IN语句一样具体,而我需要id_list = [2,3,4] cursor.execute("SELECT * FROM student WHERE id != ANY(%s)), (id_list,);

{{1}}

此外,在我的搜索中,我遇到了pyscopg2 extension SQL_IN。可以在这种情况下使用吗?如果是这样,我该如何使用它?

2 个答案:

答案 0 :(得分:3)

当你这样做时

select 2 != any(array[2,3,4]);
 ?column? 
----------
 t

2将与所有数组项进行比较,如果2不相等,则评估为true

使用not id = any(array[2,3,4])

select not 1 = any(array[2,3,4]);
 ?column? 
----------
 t

select not 2 = any(array[2,3,4]);
 ?column? 
----------
 f

!= all

select 1 != all(array[2,3,4]);
 ?column? 
----------
 t

select 2 != all(array[2,3,4]);
 ?column? 
----------
 f

答案 1 :(得分:0)

SQL_IN适配器可以通过调整元组来使用IN运算符,而不是列表(列表适用于PostgreSQL数组)。要使查询起作用,您应该按如下方式编写代码:

id_list = (2,3,4) # Note the tuple!
cursor.execute("SELECT * FROM student WHERE id NOT IN %s", (id_list,));