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

标签 postgresql list parameters psycopg2 where-in

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

我已经尝试过以下三个调用:

# Using list
cursor.execute(
    "SELECT age FROM user WHERE %(names) = '{}' OR user.name IN %(names)s",
    {'names': []},
)

# Using tuple
cursor.execute(
    "SELECT age FROM user WHERE %(names) = () OR user.name IN %(names)s",
    {'names': ()},
)

# Using both list and tuple
cursor.execute(
    "SELECT age FROM user WHERE %(names_l) = '{}' OR user.name IN %(names_t)s",
    {'names_l': [], 'names_t': ()},
)

但它们都从某一点或另一点引发无效语法错误:

# 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 ()

最佳答案

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

where column = :parameter or :parameter is null

当参数 为 null 时,将返回所有行,否则仅返回满足条件的行。

Psycopg 将 Python list 适配为 Postgresql array。检查是否有任何 Postgresql array 值等于某个值:

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

要从一个空的 Python list 中获取一个适用于 Postgresql null 的 Python None:

parameter = [] or None

字典传递给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

关于postgresql - 如何检查值是否在列表中或列表是否为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41869058/

相关文章:

python - 根据列表的条件在 DataFrame 中创建新列

jquery - 如何使用 jQuery "load"执行带有额外参数的 GET 请求?

java - 在java中创建一个带有char参数的方法

parameters - 如何在 Aurelia 中动态绑定(bind) route-href 参数?

PostgreSQL:可以允许错误吗?

sql - 如何从 Postgresql 中的纬度和经度查找城市名称?

postgresql - 如何在 postgres 数据库中创建单个表的备份?

c# - EntityFramework6/Npgsql : how to translate orderBy nulls last into SQL query

python - 列表元素的公平划分

python - 字典和列表在传递给函数时看起来是不可变的