2014-02-10 6 views
3

Как использовать string substitution в Psycopg2 для обработки как значений NULL, так и не-NULL?pyscopg2 select NULL values ​​

Например:

sql = 'SELECT * FROM table WHERE col = %s;' 
possible_params = [1, None] 

for x in possible_params: 
    print cur.mogrify(sql,(x,)) 

мне нужен первый запрос, чтобы выглядеть SELECT * FROM table WHERE col = 1; И второе, чтобы быть функциональным эквивалентом SELECT * FROM table WHERE col IS NULL;

Есть ли подвох? У меня много столбцов, которые могут быть NULL или имеют значение, поэтому динамическое построение SQL довольно громоздко.

ответ

2

Каждый раз, когда вы не знаете, если параметр будет NULL вы можно использовать следующую схему:

SELECT * FROM table WHERE col = <parameter> OR (col IS NULL AND <parameter> IS NULL) 

где <parameter> ваш р arameter.

Но учтите, что я использую один и тот же параметр два раза подряд, поэтому вам нужно переключиться на формат dict. Полный код:

sql = 'SELECT * FROM table WHERE col = %(p)s OR (col IS NULL AND %(p)s IS NULL)' 
possible_params = [{"p":1}, {"p":None}] 

for x in possible_params: 
    print cur.mogrify(sql,(x,)) 
0

Я попробовал все, что я мог думать:

SELECT COUNT(*) FROM table WHERE col = Null; 
SELECT COUNT(*) FROM table WHERE col::TEXT = ''; 
SELECT COUNT(*) FROM table WHERE col IN (Null::TEXT); 
SELECT COUNT(*) FROM table WHERE col IN (VALUES (NULL::TEXT)); 

, а затем просто пюре запутано, если заявления, например:

if record['api'] is not None: 
    sql += 'api = %(api)s' 
else: 
    sql += 'api IS NULL' 
+0

Радость от NULL –