PL/Python。如何使用 None type at where 子句作为整数?

PL/Python. How to use None type at where clouse for integer?

所以,我有一个与下面相同的查询:

query = plpy.prepare(
    "SELECT count(id) FROM contracts WHERE dependent_id = ",  
    ["integer"])

params = [dependent_id]

plpy.execute(query, params)

如果我的字段 dependent_id 不是 None,则效果很好。 但是,如果我在此字段中有一个 None,则查询工作不正确。 因为当你与 NULL

比较时,=IS 不同

我尝试使用 if-else 表达式来更正我的查询字符串,但是当查询包含 IS 时,我发现语法异常。

在我使用 IS 关键字记录查询后(当我的字段是 None 时),我在 PSQL shell 中执行了它,它工作得很好。

那么,为什么 ISplpythonu 存储过程中不起作用,但在本机 SQL 查询中仍然有效?

更新:

我在工作中与 DBA 进行了讨论,他认为这是 plpythonu 中类型转换的错误。因为 plpy.execute 当我们尝试将 IS 与整数类型一起使用时出现异常。

将字段声明为整数并在准备步骤的查询中使用 IS 后,您将在执行步骤中遇到语法异常。

解决方法是查询字符串,其中明显指示您的 None 字段为 IS NULLIS NOT NULL

P.S。对不起我的英语。

您可以尝试准备两个单独的 SQL 语句来处理 Python 的动态类型:

query = plpy.prepare("SELECT count(id) FROM contracts WHERE dependent_id = ",  ["integer"]) if dependant_id is not None else plpy.prepare("SELECT count(id) FROM contracts WHERE dependent_id IS NULL",  [])

if dependant_id is None:
   plpy.execute(query, [])
else:
   plpy.execute(query, [dependant_id])