如何检查值是否在列表中或列表是否为空?

时间:2017-01-26 08:01:42

标签: postgresql list parameters psycopg2 where-in

我使用psycopg2通过Python 3访问PostgreSQL数据库,我尝试进行查询,我想要选择名称在列表中的所有用户,如果列表不为空。如果提供的列表为空,我想忽略该条件,即选择所有用户而不管其名称。

我已经尝试了以下三个电话:

# Using list
psycopg2.ProgrammingError: syntax error at or near "'{}'"
LINE 17:         user.name IN '{}'

# Using tuple
psycopg2.ProgrammingError: syntax error at or near ")"
LINE 16:         () == ()

# Using both list and tuple
psycopg2.ProgrammingError: syntax error at or near ")"
LINE 17:         user.name IN ()

但是他们都从一个点或另一个点引发了无效的语法错误:

{{1}}

1 个答案:

答案 0 :(得分:2)

对于可选参数,您需要一个SQL where子句,如:

where column = :parameter or :parameter is null

使用上述参数is null时将返回所有行,否则只返回满足条件的行。

Psycopg将Python list调整为Postgresql array。检查Postgresql array中的任何值是否等于某个值:

where column = any (array[value1, value2])

从空的Python None获取适用于Postgresql null的Python list

parameter = [] or None

dictionary传递给cursor.execute方法可以避免参数参数中的参数重复:

names = ['John','Mary']

query = """
    select age
    from user
    where user.name = any (%(names)s) or %(names)s is null
"""
print (cursor.mogrify(query, {'names': names or None}).decode('utf8'))
#cursor.execute(query, {'names': names or None})

输出:

select age
from user
where user.name = any (ARRAY['John', 'Mary']) or ARRAY['John', 'Mary'] is null

当列表为空时:

select age
from user
where user.name = any (NULL) or NULL is null

http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries