如何在Psycopg2中使用string substitution来处理NULL和非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非常麻烦。
答案 0 :(得分:4)
每当您不知道参数是否为NULL
时,您可以使用以下模式:
SELECT * FROM table WHERE col = <parameter> OR (col IS NULL AND <parameter> IS NULL)
其中<parameter>
是您的参数。
但请注意,我连续两次使用相同的参数,因此您需要切换到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,))
答案 1 :(得分: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));
然后只是捣乱kludgy if语句,例如:
if record['api'] is not None:
sql += 'api = %(api)s'
else:
sql += 'api IS NULL'