【问题标题】:How do I use the Postgresql ANY operator in a NOT IN statement如何在 NOT IN 语句中使用 Postgresql ANY 运算符
【发布时间】:2014-11-17 05:48:10
【问题描述】:

使用 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,); 

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

【问题讨论】:

    标签: python postgresql psycopg2


    【解决方案1】:

    当你这样做时

    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
    

    【讨论】:

    • not id = any(...) 不返回 null 值,所以如果你想要 null 使用 un 加法或 id 为 null
    【解决方案2】:

    SQL_IN 适配器可以通过适配 tuple 而不是列表(列表适用于 PostgreSQL 数组)来使用 IN 运算符。为了使您的查询工作,您应该编写如下代码:

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

    【讨论】:

    • 首先如何配置光标以使用SQL_IN 适配器?
    • 默认已经配置好了。它是列表的默认适配器。
    猜你喜欢
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多