psycopg2 选择 NULL 值

Posted

技术标签:

【中文标题】psycopg2 选择 NULL 值【英文标题】:pyscopg2 select NULL values 【发布时间】:2014-02-10 02:04:27 【问题描述】:

如何在 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 相当麻烦。

【问题讨论】:

【参考方案1】:

每次您不知道参数是否为NULL 时,您可以使用以下模式:

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

&lt;parameter&gt; 是您的参数。

但请注意,我连续两次使用相同的参数,因此您需要切换到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,))

【讨论】:

【参考方案2】:

我想尽了办法:

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'

【讨论】:

以上是关于psycopg2 选择 NULL 值的主要内容,如果未能解决你的问题,请参考以下文章

psycopg2 连接问题,无法选择列,但连接正常

Psycopg2 在 postgres 数据库中插入 python 字典

psycopg2连接问题,无法选择列,但连接正常

Psycopg2 - 返回前 1000 个结果并随机选择一个

如何显式引用字符串值(Python DB API/Psycopg2)

python psycopg2选择时区的current_timestamp问题