如何在 psycopg 中使用 SELECT 查询查找空值?

Tel*_*lur 5 python null psycopg2

我在 python 中使用 psycopg2 库,INSERT当我用 None 插入空值时,查询效果很好,但是当我想要SELECT做空值时,用 None 不返回任何值。

cur.execute("SELECT id FROM registro WHERE id_movil = (%s);", (None,))
Run Code Online (Sandbox Code Playgroud)

此查询不返回任何行,我不知道错误在哪里。

任何人都知道如何进行SELECT查询以在数据库中查找空值?

pax*_*blo 7

首先要做的是找出它将您的命令转换为什么查询:

print(cur.mogrify("SELECT id FROM registro WHERE id_movil = (%s);", (None,)))
Run Code Online (Sandbox Code Playgroud)

如果这给您提供了除代码IS NULL检查之外的任何内容,则它不会从表中获得 NULL。

具体来说,如果您看到短语= NULL,您就会知道它没有被正确翻译(1),您必须执行以下操作:

if var is None:
    cur.execute("SELECT id FROM registro WHERE id_movil IS NULL;")
else:
    cur.execute("SELECT id FROM registro WHERE id_movil = (%s);", (var,))
Run Code Online (Sandbox Code Playgroud)

或者,如果您知道自己一直在寻找NULL值(正如您对常量的使用None似乎表明的那样),只需使用:

cur.execute("SELECT id FROM registro WHERE id_movil IS NULL;")
Run Code Online (Sandbox Code Playgroud)

(1)当参数是 时,很有可能只有%s被 a 替换,而且返回并更改为(或变为)还不够聪明。NULLNone=IS<>IS NOT

这将解释为什么这样做:

cur.execute("INSERT into mytbl value (%s);", (None,))
Run Code Online (Sandbox Code Playgroud)

(因为替代只有%s给你想要的命令),但与任何= NULL预期不会采取行动,除非你已经被它足够的时间烧毁知道会发生什么事情:-)。