2014-02-10 74 views
3

如何在Psycopg2中使用string substitution來處理NULL和非NULL值?pyscopg2選擇NULL值

例如:

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>是你的p 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語句,如:

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

NULL –