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

luk*_*kik 6 python postgresql psycopg2

使用 Pyscopg2,如何使用 ANY 运算符将 Python 列表传递到 SQL 语句中?

正常工作的 SQL 读取(请参阅 SQL Fiddle):

SELECT * FROM student WHERE id NOT IN (3);
Run Code Online (Sandbox Code Playgroud)

使用 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); 
Run Code Online (Sandbox Code Playgroud)

Psycopg2:查询 2

下面的查询不会引发错误,但会给出错误的结果,因为它不排除列表中的 ID。它表现得好像它是一个等于运算符,或者像它的IN语句一样具体,而我想要一个NOT IN

id_list = [2,3,4]
cursor.execute("SELECT * FROM student WHERE id != ANY(%s)), (id_list,); 
Run Code Online (Sandbox Code Playgroud)

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

Clo*_*eto 10

当你做

select 2 != any(array[2,3,4]);
 ?column? 
----------
 t
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

或者 != all

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

select 2 != all(array[2,3,4]);
 ?column? 
----------
 f
Run Code Online (Sandbox Code Playgroud)