2017-01-26 10 views
3

Ich verwende psycopg2 Python eine PostgreSQL-Datenbank über 3 zugreifen zu können, und ich bin versucht, eine Abfrage zu machen, wo ich alle Benutzer Namen in einer Liste enthalten sind, deren auswählen möchten, wenn die Liste nicht leer ist. Wenn die bereitgestellte Liste leer ist, möchte ich die Bedingung ignorieren, d.h. alle Benutzer unabhängig von ihrem Namen auswählen.Wie überprüft man, ob der Wert in einer Liste ist oder ob die Liste leer ist?

Ich habe bereits versucht, die folgenden drei Aufrufe:

# 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':()}, 
) 

Aber sie alle heben einen ungültigen Syntaxfehler von einem Punkt oder einen anderen:

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

Antwort

2

Für optionale Parameter möchten Sie ein SQL where Klausel wie:

where column = :parameter or :parameter is null 

Mit dem oben genannten wenn th Der Parameter is null alle Zeilen werden zurückgegeben, andernfalls nur diejenigen, die die Bedingung erfüllen.

Psycopg passt einen Python list an einen Postgresql array an. Um zu überprüfen, ob einer der Postgresql array Werte auf einen bestimmten Wert gleich ist:

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

Um eine Python None, die zu einer Postgresql angepasst ist null, aus einem leeren Python list:

parameter = [] or None 

ein dictionary zur cursor.execute Methode übergeben vermeidet Parameter Wiederholung in dem Argumentparameter:

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}) 

Ausgang:

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

Wenn die Liste leer ist:

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

ich jetzt wirklich dumm fühlen, wusste nicht, ich SQLs verwenden könnte 'NULL' obwohl ich wusste, es existiert und alles ... Aber das hat super funktioniert, danke für die Hilfe! :) –

Verwandte Themen