psycopg2选择NULL值

时间:2014-02-10 02:04:28

标签: python postgresql postgresql-9.2 psycopg2

如何在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非常麻烦。

2 个答案:

答案 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'