2017-01-26 13 views
3

Я использую psycopg2 для доступа к базе данных PostgreSQL через Python 3, и я пытаюсь сделать запрос, в котором я хочу выбрать всех пользователей, чье имя находится в списке, , если список не пуст. Если предоставленный список пуст, я хочу проигнорировать условие, то есть выбрать всех пользователей независимо от их имени.Как проверить, включено ли значение в списке или пуст ли список?

Я уже пробовал следующие три вызова:

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

ответ

2

Для дополнительных параметров, которые вы хотите SQL where такой как:

where column = :parameter or :parameter is null 

С вышеуказанным, когда e параметр 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

+0

Я чувствую себя очень глупо сейчас, не понимаю, что я мог бы использовать 'NULL' SQL, даже если бы я знал, он существует и все ... Но это отлично поработало, спасибо за помощь! :) –