0

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

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

params = [dependent_id]

plpy.execute(query, params)

如果我的领域dependent_id不是None,它运作良好。但是,如果我None在这个领域有一个,查询就会不正确。因为与你比较时=不一样ISNULL

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

在我用IS关键字(当我的字段是None)记录我的查询后,我在 PSQL shell 中执行了它,它运行良好。

那么,为什么IS不能在plpythonu存储过程中工作,但仍然可以在本机 SQL 查询中工作呢?

更新:

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

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

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

PS对不起我的英语。

4

1 回答 1

1

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

query = plpy.prepare("SELECT count(id) FROM contracts WHERE dependent_id = $1",  ["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])
于 2018-02-14T09:58:18.613 回答