所以,我的查询与下面相同:
query = plpy.prepare(
"SELECT count(id) FROM contracts WHERE dependent_id = $1",
["integer"])
params = [dependent_id]
plpy.execute(query, params)
如果我的字段dependent_id
不是None
,则效果很好。
但是,如果我在此字段中有None
,则查询工作不正确。
与=
IS
与NULL
不同
我尝试使用if-else表达式来更正我的查询字符串,但是当查询包含IS
时,我会抓住语法异常。
在我使用IS
关键字记录我的查询后(当我的字段为None
时),我在PSQL shell中执行了它,并且它运行良好。
那么,为什么IS
不能在plpythonu
存储过程中工作,但仍然在本机SQL查询中工作?
我在工作中与DBA进行过讨论,他认为plpythonu
中有类型转换的错误。因为plpy.execute
在我们尝试使用整数类型的IS
时会出现异常。
在您将字段声明为整数并在准备步骤的查询中使用IS
之后,您将在执行步骤中获得语法异常。
解决方法是查询字符串,明确指出您的None
字段为IS NULL
或IS NOT NULL
P.S。抱歉我的英文。
答案 0 :(得分: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])