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)
<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,))
【讨论】:
【参考方案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 在 postgres 数据库中插入 python 字典
Psycopg2 - 返回前 1000 个结果并随机选择一个